从XML解析,插入到mysql; 字符给java.sql.SQLException:字符串值不正确

Sha*_*wal 3 java xml mysql utf-8 utf8mb4

我正在解析一堆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)
Run Code Online (Sandbox Code Playgroud)

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

有两种可能的方法我试图解决它,并且还没有成功 -

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

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

Jör*_*ann 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,首先必须进行升级.在以后的版本中,您必须将charset更改为utf8mb4才能使用这些补充字符.

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

使用带有Connector/J的4字节UTF8配置MySQL服务器character_set_server=utf8mb4.只要characterEncoding尚未在连接字符串中设置,Connector/J就会使用该设置.这相当于自动检测字符集.