3

我正在解析一堆 XML 文件并将从它们获得的值插入到 MySQL 数据库中。mysql表的字符集设置为utf8。我正在使用以下连接 url 连接到数据库 -jdbc:mysql://localhost:3306/articles_data?useUnicode=false&characterEncoding=utf8

大多数带有 unicode 字符的字符串值都可以正常输入(如希腊字母等),除了一些带有数学符号的字符串值。特别是一个例子 - 当我尝试插入一个带有数学脚本大写 g 的字符串时(img at www.ncbi.nlm.nih.gov/corehtml/pmc/pmcents/1D4A2.gif)(http://graphemica.com/) (试图解析并插入这篇文章),我得到以下异常 -

java.sql.SQLException: Incorrect string value: '\xF0\x9D\x92\xA2 i...' for column 'text' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3515)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2554)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1761)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2046)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1964)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1949)

如果我将连接 URL 更改为 - jdbc:mysql://localhost:3306/articles_data,则插入有效,但所有常规 UTF8 字符都替换为问号。

我试图修复它有两种可能的方法,但都没有成功 -

  1. 解析文章时,保持编码。我org.apache.xerces.parsers.DOMParser用来解析 xml 文件,但不知道如何防止它解码(相关 XML - <p>&#x1d4a2; is a set containing...</p>)。我可以重新编码它,但这似乎效率低下。

  2. 将数学符号插入数据库。

4

1 回答 1

6

MySQL 到 5.1 版似乎只支持基本多语言平面中的 unicode 字符,编码为 utf-8 时占用不超过 3 个字节。从5.1 版中的 unicode 支持手册

MySQL 5.1 支持两种字符集来存储 Unicode 数据:

  • ucs2,Unicode 字符集的 UCS-2 编码,每个字符使用 16 位
  • utf8,Unicode 字符集的 UTF-8 编码,每个字符使用一到三个字节

5.5 版中,添加了一些新字符集:

...

  • utf8mb4,Unicode 字符集的 UTF-8 编码,每个字符使用一到四个字节

ucs2 和 utf8 支持 BMP 字符。utf8mb4、utf16 和 utf32 支持 BMP 和补充字符。

因此,如果您使用的是 mysql 5.1,则首先必须升级。在以后的版本中,您必须将字符集更改为 utf8mb4 才能使用这些补充字符。

似乎 jdbc 连接器还需要一些进一步的配置(来自Connector/J Notes and Tips):

要将 4 字节 UTF8 与 Connector/J 一起使用,请使用character_set_server=utf8mb4. 只要characterEncoding未在连接字符串中设置,Connector/J 就会使用该设置。这相当于字符集的自动检测。

于 2011-07-14T15:42:14.350 回答