1. 程式人生 > 其它 >嘗試通過 JDBC 將 UTF-8 插入 MySQL 時出現“亂碼”

嘗試通過 JDBC 將 UTF-8 插入 MySQL 時出現“亂碼”

這是我的連線設定方式:

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):

  1. 修改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在預設情況下。
*/


  1. 重啟MySQL

  2. 將你原先的表和列編碼更改為 utf8mb4

方案二(不需要重啟mysql):

  1. 將表和列編碼更改為 utf8mb4

  2. characterEncoding=UTF-8在 jdbc 聯結器中指定,因為 jdbc 聯結器不支援utf8mb4.

  3. 像這樣寫你的sql語句(需要新增allowMultiQueries=true到jdbc聯結器):

'SET NAMES utf8mb4;INSERT INTO Mytable ...';

這將確保與伺服器的每個連線character_set_client,character_set_connection,character_set_results都是utf8mb4.