客戶端編輯器編碼 (GBK/UTF-8)
↓ 轉換
character_set_client (客戶端發送編碼)
↓ 轉換
character_set_connection (連接層編碼)
↓ 轉換
數據庫/表/列存儲編碼 (character_set_database/table/column)
↓ 轉換
character_set_results (結果集編碼)
↓ 顯示
客戶端顯示編碼 (CMD/CRT/Workbench)
| 變量 | 作用層級 | 繼承鏈路 |
|---|---|---|
character_set_server | 服務器級 | my.cnf character-set-server → 編譯默認 latin1 |
character_set_database | 數據庫級 | CREATE DATABASE ... CHARSET → server |
character_set_table | 表級 | CREATE TABLE ... CHARSET → database |
character_set_column | 列級 | COLUMN ... CHARSET → table |
character_set_client | 會話級 | 客戶端驅動發送 / SET NAMES |
character_set_connection | 會話級 | SET NAMES / client |
character_set_results | 會話級 | SET NAMES / client |
character_set_filesystem | 文件系統 | 默認 binary (不轉換) |
character_set_system | 系統標識符 | 固定 UTF-8 (表名/列名/用戶名) |
Latin1 (ISO-8859-1) = 單字節 0x00-0xFF 完全覆蓋。
| 方案 | 設置方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| 全 Latin1 | SET NAMES latin1; 表/庫默認 latin1 | 最簡單、任意編碼兼容、無損 | 無法在 SQL 直接 LIKE 中文、排序錯誤、函數不支援 | 純存儲/傳輸、不需 SQL 處理中文 |
| 全 UTF-8 (推薦) | my.cnf character-set-server=utf8mb4 表 CHARSET=utf8mb4 連接 SET NAMES utf8mb4 | 標準化、SQL 原生支援中文、排序正確、Emoji 支援 | 需確保客戶端/驅動/應用全鏈路 UTF-8 | 現代應用首選 |
| 混合模式 | client/connection=latin1, storage=gbk/utf8 | 兼容老系統 GBK 客戶端 | 極易搞錯、維護噩夢 | 歷史遷移過渡期 |
chcp (預設 936=GBK),PowerShell $OutputEncoding,CRT Session Options → Encoding。SHOW VARIABLES LIKE 'character_set_%';SET NAMES utf8mb4; (等同於同時設 client/connection/results)。SHOW CREATE TABLE t; 確認 CHARSET=utf8mb4。INSERT ... VALUES ('測試'); SELECT * FROM t; 無亂碼即成功。utf8 只有 3 字節,**不支援 Emoji/生僻字**,必須用 utf8mb4。characterEncoding=utf8、PHP PDO charset=utf8mb4、Python charset='utf8mb4' 必須顯式指定。SOURCE 導入亂碼。utf8mb4_general_ci (快、不準確) vs utf8mb4_unicode_ci (慢、標準),按業務選擇。中文亂碼本質是**編碼轉換鏈路斷裂**。現代最佳實踐:**全鏈路 utf8mb4** (Server/Database/Table/Column/Connection/Client/Driver/File)。Windows 下特別注意 CMD/CRT/PowerShell 顯示編碼與 MySQL 會話編碼一致。一條 SET NAMES utf8mb4 解決 90% 會話級問題,配合 character-set-server=utf8mb4 解決剩餘 10% 存儲級問題。