2011-07-14 35 views
3

我解析了一堆XML文件,並將從它們獲得的值插入到MySQL數據庫中。 mysql表的字符集設置爲utf8。我使用以下連接url連接到數據庫 - jdbc:mysql://localhost:3306/articles_data?useUnicode=false&characterEncoding=utf8從XML解析,插入到mysql;字符給java.sql.SQLException:錯誤的字符串值

帶有Unicode字符的大多數字符串值都輸入正確(像希臘字母等),但有些數字符號除外。一個特別的例子 - 當我試圖插入一個字符串與數學腳本大寫g(img在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) 

如果我改變我的連接網址 - JDBC的:mysql://本地主機:3306/articles_data,然後在插入的作品,但所有常規的UTF8字符被替換爲問號。

有兩種可能的方法,我試圖修復它,並在要麼沒有成功,但 -

  1. 當解析文章,保持編碼。我使用org.apache.xerces.parsers.DOMParser解析XML文件,但無法弄清楚如何防止解碼(相關的XML - <p>&#x1d4a2; is a set containing...</p>)。我可以重新編碼它,但這似乎效率低下。

  2. 將數學符號插入到數據庫中。

+0

請檢查您的xml文件的編碼。那是UTF-8嗎?你的應用程序在哪個操作系統上運行? – powerMicha

+0

爲什麼在網址中useUnicode = false? –

+0

@Alex:我首先嚐試了'useUnicode = true',但沒有什麼區別。我把它變成了錯誤,期望它不會強制嘗試將它作爲utf8字符插入,並會回退到不喜歡它的問號。 @powerMicha:我現在正在Windows上測試它。 XML頭沒有提供關於文件編碼的任何信息,但是當我解析它時,它將編碼的字符轉換爲(我假設)UTF-8。我假設,因爲如果我stdout分析的字符串,並在NP + UTF-8編碼看它,它看起來是正確的。 –

回答

6

直到版本5.1的MySQL似乎只支持基本多語言平面中的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):

要使用帶連接器/ J 4字節UTF8配置MySQL服務器character_set_server=utf8mb4。只要characterEncoding尚未在連接字符串中設置,連接器/ J將使用該設置。這相當於字符集的自動檢測。

+0

服務器是5.5!我將表格的編碼更改爲utfmb4,但仍然出現錯誤。我將連接url切換到'jdbc:mysql:// localhost:3306/articles_data?useUnicode = false&characterEncoding = utf8mb4',但是這給了我一個'Unsupported character encoding'utf8mb4'.'錯誤。 –

+1

@Shashank Agarwal,這個jdbc連接器的提示可能也是相關的:http://download.oracle.com/docs/cd/E17952_01/refman-5.1-en/connector-j-usagenotes-troubleshooting.html#qandaitem- 21-3-5-3-1-15 –

+0

該提示修復了它!謝謝 :)。 –