| 層級 | 變量 | 說明 |
| Server | character_set_server / collation_server | 實例級預設 |
| Database | character_set_database / collation_database | 庫級預設 (CREATE DATABASE 繼承 Server) |
| Table | DEFAULT CHARACTER SET / COLLATE | 表級預設 (繼承 Database) |
| Column | CHARACTER SET / COLLATE | 欄位級 (繼承 Table),最終生效層 |
連接層字符集變量 (關鍵)
character_set_client -- 客戶端發送 SQL 的編碼
character_set_connection -- Server 將 client 編碼轉換到此編碼做內部操作
character_set_results -- Server 返回結果集/錯誤訊息的編碼
設定連接編碼三種方式
-- 方式 1: SET NAMES (最常用)
SET NAMES 'utf8mb4';
-- 等價於
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;
-- 方式 2: SET CHARACTER SET
SET CHARACTER SET 'utf8mb4';
-- 等價於
SET character_set_client = utf8mb4;
SET character_set_results = utf8mb4;
SET collation_connection = @@collation_database;
-- 方式 3: 連接參數 (驅動層自動發送)
-- JDBC: characterEncoding=utf8mb4
-- PHP PDO: charset=utf8mb4
-- Python: charset='utf8mb4'
元數據強制 UTF-8
- 資料庫名、表名、欄位名、用戶名等**元數據**統一儲存為 **UTF-8** (
character_set_system)。
- 保證
INFORMATION_SCHEMA、SHOW 指令跨語言正常顯示。
常用檢查指令
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
SHOW CHARACTER SET;
SHOW COLLATION;
SELECT HEX(col), LENGTH(col), CHAR_LENGTH(col), CHARSET(col), COLLATION(col) FROM tbl;
實戰避坑指南
- **建庫建表顯式指定**
CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci,不依賴預設。
- **連接建立即發送 SET NAMES utf8mb4** (長連接重連後必須重發)。
my.cnf default-character-set **僅影響 mysql 命令列客戶端**,不影響 libmysqlclient 應用。
- SQL 函數操作 (如
UPPER()) 在**內部操作字符集**執行,不受連接編碼影響。
- 裸字串字面值受
character_set_connection 或 _charset 介紹符影響,比較時需注意。
結語
MySQL 字符集體系「四層級繼承 + 三連接變量 + 元數據固定 UTF-8」。掌握 SET NAMES、CHARSET()、HEX() 排查亂碼核心工具,**顯式配置 > 隱式繼承** 是防亂碼鐵律。
- 上一篇文章: MySQL 實戰:用 INET_ATON()/INET_NTOA() 高效儲存與查詢 IP 地址
- 下一篇文章: 深度解析 MySQL 字符集設定:從基本概念到轉換流程、常見亂碼場景與最佳實踐
Copyright ©
程式碼之家 All Rights Reserved