| 變量 | 角色 | 典型值 |
|---|---|---|
character_set_client | 客戶端發送數據的編碼 | utf8mb4 |
character_set_connection | 連接層轉換目標編碼 | utf8mb4 |
character_set_results | 結果集返回給客戶端的編碼 | utf8mb4 |
character_set_server | 服務器內部操作默認編碼 | utf8mb4 |
character_set_database | 當前庫默認編碼 | utf8mb4 |
character_set_system | 系統元數據編碼(固定 utf8) | utf8 |
client → connection(若不一致則轉換)connection → 列/表/庫/Server 默認(按優先級落地存儲)內部編碼 → results(返回客戶端)-- 寫入時:client=latin1, connection=latin1, results=latin1
-- 實際數據為 UTF-8(3 字節/中文)
-- 經歷:latin1 → latin1 → utf8 存儲 → 每個中文變 6 字節(雙重編碼)
-- 讀取時:client=utf8, connection=utf8, results=utf8
-- 經歷:utf8 → utf8 返回 → 6 字節原樣輸出 → 客戶端按 UTF-8 解碼 → 亂碼
-- 寫入:client=utf8, connection=utf8, results=utf8
-- 經歷:utf8 → utf8 → latin1 存儲 → 超出 latin1 範圍字符變 ? (0x3F) → 永久損壞
-- 後續任何連接讀取均無法恢復原文
SELECT _utf8mb4 '中文' COLLATE utf8mb4_unicode_ci;
INSERT INTO t(col) VALUES (_latin1 'abc');
帶 Introducer 的字面值**跳過連接層轉換**,直接按指定編碼進入內部處理。
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';
SELECT HEX(col), LENGTH(col), CHAR_LENGTH(col) FROM t WHERE id=1;
SELECT CHARSET(col), COLLATION(col) FROM t LIMIT 1;
characterEncoding、PHP mysqli_set_charset、Python charset='utf8mb4'),免去 SET NAMES 額外圍觀。my.cnf 的 default-character-set **僅影響 mysql 命令列客戶端**,不影響 libmysqlclient 應用。UPPER()、SUBSTRING() 等)在**內部操作編碼**下執行,不受連接編碼影響。COLLATE。| 字符集 | Maxlen | 說明 |
|---|---|---|
| latin1 | 1 | 單字節,僅支援西歐字符 |
| gbk | 2 | 雙字節,支援中日韓 |
| utf8mb3 | 3 | BMP 平面,無 Emoji |
| utf8mb4 | 4 | 完整 Unicode,含補充平面 |
⚠️ **轉換時若目標 Maxlen < 來源 Maxlen,超出範圍字符將截斷或變 ?,造成不可逆資料損失。**