我正在解析一堆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/) (尝试解析并插入this文章),我得到以下异常 -
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字符都会替换为问号。
我有两种可能的方法来解决它,并且还没有成功 -
解析文章时,请保持编码。我正在使用org.apache.xerces.parsers.DOMParser
来解析xml文件,但无法弄清楚如何防止它解码(相关的XML - <p>𝒢 is a set containing...</p>
)。我可以重新编码,但这看起来效率低下。
将数学符号插入数据库。
答案 0 :(得分:6)
MySQL 5.1版似乎只支持基本多语言平面中的unicode字符,当编码为utf-8时,不超过3个字节。来自manual on unicode support in version 5.1:
MySQL 5.1支持两个用于存储Unicode数据的字符集:
- ucs2,Unicode字符集的UCS-2编码,每个字符使用16位
- utf8,Unicode字符集的UTF-8编码,每个字符使用一到三个字节
在version 5.5中添加了一些新的字符集:
...
- utf8mb4,Unicode字符集的UTF-8编码,每个字符使用一到四个字节
ucs2和utf8支持BMP字符。 utf8mb4,utf16和utf32支持BMP和补充字符。
因此,如果你使用的是mysql 5.1,首先必须进行升级。在以后的版本中,您必须将charset更改为utf8mb4以使用这些补充字符。
似乎jdbc连接器还需要进一步配置(来自Connector/J Notes and Tips):
要使用带有Connector / J的4字节UTF8,请使用
character_set_server=utf8mb4
配置MySQL服务器。只要未在连接字符串中设置characterEncoding
,Connector / J就会使用该设置。这相当于自动检测字符集。