嘗試通過 JDBC 將 UTF-8 插入 MySQL 時出現“亂碼”
阿新 • • 發佈:2021-08-02
這是我的連線設定方式:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);
並且在嘗試向表中新增行時出現以下錯誤:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1
我正在插入數千條記錄,當文字包含 \xF0 時,我總是收到此錯誤(即錯誤的字串值總是以 \xF0 開頭)。
該列的排序規則是 utf8_general_ci。
可能是什麼問題呢?
回答
解決方法
遇到同樣的問題,儲存資料utf8mb4需要確保:
character_set_client, character_set_connection, character_set_results是utf8mb4:character_set_client和character_set_connection指示字符集,
其中的語句由客戶端傳送,character_set_results指示字符集的伺服器查詢結果返回給客戶端。
請參閱字符集連結
表和列編碼是 utf8mb4
對於JDBC,有兩種解決方案:
方案一(需要重啟mysql):
- 修改my.cnf如下並重新啟動MySQL:
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci //這個可能會沒有,那就新增進去
/*
這可以確保資料庫character_set_client, character_set_connection, character_set_results是utf8mb4在預設情況下。
*/
-
重啟MySQL
-
將你原先的表和列編碼更改為 utf8mb4
方案二(不需要重啟mysql):
-
將表和列編碼更改為 utf8mb4
-
characterEncoding=UTF-8在 jdbc 聯結器中指定,因為 jdbc 聯結器不支援utf8mb4.
-
像這樣寫你的sql語句(需要新增allowMultiQueries=true到jdbc聯結器):
'SET NAMES utf8mb4;INSERT INTO Mytable ...';
這將確保與伺服器的每個連線character_set_client,character_set_connection,character_set_results都是utf8mb4.