我正在解析一堆XML文件,并将从中获取的值插入到MySQL数据库中。 mysql表的字符集设置为utf8。我使用以下连接URL连接到数据库 - jdbc:mysql://localhost:3306/articles_data?useUnicode=false&characterEncoding=utf8
大多数带有Unicode字符的字符串值都可以正常输入(例如希腊字母等),但是对于某些具有数学符号的字符串则不行。特别是一个例子 - 当我尝试插入一个带有数学脚本大写字母g的字符串时(在www.ncbi.nlm.nih.gov/corehtml/pmc/pmcents/1D4A2.gif上的img)(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>𝒢是一个包含...</p>
)。我可以重新编码它,但这似乎效率低下。2.将数学符号插入数据库中。
useUnicode=false
? - Alex GitelmanuseUnicode=true
,但并没有什么区别。我把它设为 false,希望它不会强制将其插入为 utf8 字符,并在不喜欢的地方回退到问号。 @powerMicha:我现在在 Windows 上测试它。XML 标头没有提供有关文件编码的任何信息,但是当我解析它时,它会将编码字符转换为(我认为是)UTF-8。我假设是这样,因为如果我将解析后的字符串输出到 NP++ 中,并使用 UTF-8 编码查看它,它就会正确显示。 - Shashank Agarwal