MySQL 字符集相關變量分四層,**優先級由高到低**:
SET NAMES utf8mb4 / SET character_set_client=... 當前連接生效,斷開失效。SET GLOBAL character_set_server=utf8mb4 或配置文件,影響**新建連接**,現有連接不變。[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
skip-character-set-client-handshake = ON # 強制忽略客戶端指定編碼,統一由服務端決定
驗證:重啟後 SHOW VARIABLES LIKE 'character_set_%'; 所有 *_server/client/connection/results/database/filesystem 均為 utf8mb4 (filesystem 為 binary 正常)。
SET NAMES utf8mb4;
-- 等價於:
SET character_set_client = utf8mb4;
SET character_set_results = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_database = utf8mb4; -- 僅影響當前會話默認庫字符集
SET character_set_results = utf8mb4;
SET character_set_server = utf8mb4; -- 需 SUPER 權限,影響全局新連接
SET collation_connection = utf8mb4_0900_ai_ci;
SET collation_database = utf8mb4_0900_ai_ci;
SET collation_server = utf8mb4_0900_ai_ci;
**連接層 (character_set_connection) 不匹配**。
SET NAMES utf8mb4**,或配置驅動連接參數 charset=utf8mb4 (JDBC/Python/Go/PHP/Node 均支援)。| 版本 | [mysqld] 段參數名 | 備註 |
|---|---|---|
| 5.5 及之前 | default-character-set = utf8 | 僅支援 utf8 (3字節) |
| 5.6 / 5.7 | character-set-server = utf8mb4 | 推薦 utf8mb4,default-character-set 兼容但不推薦 |
| 8.0+ | character-set-server = utf8mb4 collation-server = utf8mb4_0900_ai_ci | default-character-set 在 [mysqld] 已**移除**,使用會報錯 Unknown variable |
skip-character-set-client-handshake,重啟生效,一勞永逸。charset=utf8mb4,雙重保險。CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci,不依賴默認值。ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; (會鎖表重建,大表用 pt-online-schema-change/gh-ost)。SELECT HEX(col), col FROM t WHERE col LIKE '%中文%'; 確認 HEX 為 UTF-8 編碼字節序列。