Java 程式寫入中文到 MySQL 5 顯示亂碼,但 MySQL Admin / EMS 等工具寫入正常,程式讀取也正常。
JDBC URL 缺少字元集參數,導致驅動程式無法告知伺服器客戶端編碼:
jdbc:mysql://10.4.2.52:3306/srx?useUnicode=true&characterEncoding=utf-8
若缺少 useUnicode=true 與 characterEncoding=utf-8,伺服器預設用 latin1 (iso-8859-1) 解析 SQL,中文無法正確還原。
public void select() throws SQLException {
ResultSet rs = conn.createStatement().executeQuery("SHOW VARIABLES LIKE 'character_set_%'");
while(rs.next()){
System.out.println(rs.getString(1) + "," + rs.getString(2));
}
rs.close();
}
character_set_client,latin1
character_set_connection,latin1
character_set_database,utf8
character_set_filesystem,binary
character_set_results,latin1
character_set_server,latin1
character_set_system,utf8
character_set_client=latin1 證實客戶端編碼被誤判為 latin1。
character_set_client,utf8
character_set_connection,utf8
character_set_database,utf8
character_set_filesystem,binary
character_set_results,utf8
character_set_server,latin1
character_set_system,utf8
character_set_client=utf8 確認客戶端編碼正確,SQL 以 UTF-8 封裝傳輸,伺服器正確解析。
jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
CREATE TABLE t (c VARCHAR(100)) CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
| 參數值 | 適用場景 |
|---|---|
| utf-8 / utf8mb4 | 通用、支援 Emoji、推薦 |
| gbk | 舊系統相容、中文環境 |
| gb2312 | 極舊系統、不支援生僻字 |
| latin1 | 二進制透傳、不建議中文 |
useUnicode=true&characterEncoding=utf-8utf8mb4 而非 utf8(後者僅 3 字節,不支援 Emoji)SET NAMES utf8mb4