字元集不一致是導致中文亂碼的主因。MySQL 涉及 7 個字元集系統變數,任一環節錯誤即會產生亂碼。本文提供完整配置清單與驗證步驟。
| 變數 | 用途 | 建議值 |
|---|---|---|
character_set_server | 伺服器預設字元集 | utf8mb4 |
character_set_database | 資料庫預設字元集 | utf8mb4 |
character_set_client | 客戶端送出資料的字元集 | utf8mb4 |
character_set_connection | 連線層轉換目標字元集 | utf8mb4 |
character_set_results | 伺服器回傳結果的字元集 | utf8mb4 |
collation_server | 伺服器預設校對規則 | utf8mb4_unicode_ci |
collation_database | 資料庫預設校對規則 | utf8mb4_unicode_ci |
collation_connection | 連線層校對規則 | utf8mb4_unicode_ci |
關鍵區別: utf8mb4 支援完整 Unicode (含 Emoji、生僻字),utf8 僅支援 BMP 平面 (3 位元組),新專案務必使用 utf8mb4。
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci' skip-character-set-client-handshake # 強制忽略客戶端字元集請求
Windows 需將 my.ini 複製至 C:\Windows\ 或 MySQL 安裝目錄。
mysql> SHOW VARIABLES LIKE 'character_set_%'; mysql> SHOW VARIABLES LIKE 'collation_%';
所有 character_set_* 應顯示 utf8mb4,所有 collation_* 應顯示 utf8mb4_unicode_ci。
-- 建庫指定 CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 建表指定 (ENGINE 建議 InnoDB) CREATE TABLE t_user ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 修改既有表 ALTER TABLE t_user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
| 語言/驅動 | 設定方式 |
|---|---|
| JDBC | jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useSSL=false |
| PHP PDO | new PDO("mysql:host=...;dbname=...;charset=utf8mb4", $user, $pass) |
| Python (PyMySQL) | charset='utf8mb4' 參數 |
| Go (go-sql-driver/mysql) | dsn := "user:pass@tcp(host:3306)/db?charset=utf8mb4&parseTime=True" |
| Node.js (mysql2) | charset: 'utf8mb4' 選項 |
CONVERT(CAST(CONVERT(col USING latin1) AS BINARY) USING utf8mb4) 修復SET NAMES utf8mb4 效果等同同時設定 client、connection、results 三個變數,但不持久化,需寫入配置檔或 init_connect。統一全鏈路 utf8mb4 是解決中文亂碼的根本之道。建議將配置檔模板化納入專案規範,新環境部署即套用。