2013-07-06 75 views
0

我試圖正確地將utf8mb4字符串存儲到MySQL 5.5.30中。我們正在使用ConnectorJ 5.1.18。MySQL 5.5連接器/ J CharacterSet編碼(utf8mb4)問題

根據文檔的ConnectorJ應自動檢測基於被character_set_server變量的字符編碼...

然而,作爲最好的,我可以告訴它總是默認爲

SET NAMES處理latin1代替SET NAMES utf8mb4

日誌輸出從連接器-J分析器:

 
Sat Jul 06 15:45:20 CDT 2013 INFO: Profiler Event: [QUERY] at java.sql.DriverManager.getConnection(DriverManager.java:579) duration: 1 ms, connection-id: 57, statement-id: 3, resultset-id: 4, message: /* mysql-connector-java-5.1.18 (Revision: [email protected]) */SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'init_connect' 
Sat Jul 06 15:45:20 CDT 2013 INFO: Profiler Event: [FETCH] at java.sql.DriverManager.getConnection(DriverManager.java:579) duration: 0 ms, connection-id: 57, statement-id: 3, resultset-id: 4 
Sat Jul 06 15:45:20 CDT 2013 INFO: Profiler Event: [QUERY] at java.sql.DriverManager.getConnection(DriverManager.java:579) duration: 0 ms, connection-id: 57, statement-id: 3, resultset-id: 5, message: /* mysql-connector-java-5.1.18 (Revision: [email protected]) */SELECT @@session.auto_increment_increment 
Sat Jul 06 15:45:20 CDT 2013 INFO: Profiler Event: [FETCH] at java.sql.DriverManager.getConnection(DriverManager.java:579) duration: 0 ms, connection-id: 57, statement-id: 3, resultset-id: 5 
Sat Jul 06 15:45:20 CDT 2013 INFO: Profiler Event: [QUERY] at java.sql.DriverManager.getConnection(DriverManager.java:579) duration: 0 ms, connection-id: 57, statement-id: 4, resultset-id: 6, message: SHOW COLLATION 
Sat Jul 06 15:45:20 CDT 2013 INFO: Profiler Event: [FETCH] at java.sql.DriverManager.getConnection(DriverManager.java:579) duration: 3 ms, connection-id: 57, statement-id: 4, resultset-id: 6 
Sat Jul 06 15:45:20 CDT 2013 INFO: Profiler Event: [QUERY] at java.sql.DriverManager.getConnection(DriverManager.java:579) duration: 1 ms, connection-id: 57, statement-id: 999, resultset-id: 0, message: SET NAMES latin1 

的SHOW變量調用的輸出如下:

 
character_set_client  utf8 
character_set_connection utf8 
character_set_results  utf8 
character_set_server  utf8mb4 

服務器正在運行,並且因此更新被character_set_server價值,我只是跑

SET GLOBAL
SET
語句。

更新: 當我更改my.cnf中的character_set_server值並重新啓動我的服務器時,ConnectorJ檢測到utf8mb4完全按照它的設定。

當我使用SET GLOBAL手動設置值時,ConnectorJ繼續使用Latin1。

有人知道爲什麼會這樣嗎?有什麼方法可以更新字符集,使ConnectorJ能夠檢測到,而不必讓mysql脫機?

回答

0

我有類似的問題。它曾經是從的ConnectorJ客戶端字符集握手用來使用常規的/不完整的utf8字符集,而不是utf8mb4

https://dev.mysql.com/doc/relnotes/connector-j/en/news-5-1-13.html

自發布5.1.12中修正錯誤。 Connector/J現在可以自動檢測使用character_set_server = utf8mb4配置的服務器,或者在建立連接時調用SET NAMES =時調用使用characterEncoding = ...作爲utf8mb4傳遞的Java編碼utf-8。 (Bug#54175)

但是,升級ConnectorJ並沒有解決任何問題。順便說一句,謝謝你弄清楚,改變配置文件解決了問題,而改變運行時的值卻沒有。這爲我節省了很多時間。

對於任何具有相同問題的人,無論出於何種原因都無法重新啓動服務器。我建議(與MySQL文檔相反,當您要使用utf8mb4時,從連接字符串中省略characterEncoding)將characterEncoding=UTF-8添加到連接字符串,並在您遇到問題的連接上執行手動SET NAMES utf8mb4