字符集與校對規則是 MySQL 中處理多語言資料的核心,配置不當會導致亂碼、排序錯誤、比較失效甚至報錯 ERROR 1253 (42000): COLLATION 'xxx' is not valid for CHARACTER SET 'yyy'。本文系統梳理核心概念、命名規則、層級繼承與常見錯誤處理。
| 概念 | 作用 | 關係 |
|---|---|---|
| 字符集 | 定義字符的編碼方式與存儲格式(如 utf8mb4、gbk、latin1) | 一對多:一個字符集對應多種校對規則 |
| 校對規則 | 定義字符比較、排序的規則(大小寫敏感、語言特定排序、二進制比較) |
格式:字符集名_語言_後綴
_ci (case-insensitive):不區分大小寫,如 utf8mb4_general_ci(預設)_cs (case-sensitive):區分大小寫,如 utf8mb4_general_cs_bin (binary):二進制比較,按字符編碼值直接比較,區分大小寫且無語言語義,效能最高,如 utf8mb4_bin範例: GBK 字符集常見校對:gbk_chinese_ci(中文不區分大小寫)、gbk_bin(二進制)。
錯誤: COLLATION 'gbk_chinese_ci' is not valid for CHARACTER SET 'utf8'
原因: 表/欄位字符集為 utf8,但指定的校對規則屬於 gbk 字符集,兩者不匹配。
解決: 統一字符集與校對規則,例如:
-- 建表時指定
CREATE TABLE t (c VARCHAR(100)) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 修改既有表
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 修改單一欄位
ALTER TABLE t MODIFY c VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
MySQL 採用層級繼承機制,優先級由高到低:
COLLATE utf8mb4_bin 直接定義在欄位上DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ciCREATE DATABASE db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;character-set-server、collation-server 參數(my.cnf)未顯式指定時,向上繼承最近一層的設定。
utf8mb4 + utf8mb4_general_ci 或 utf8mb4_0900_ai_ci (MySQL 8.0+),完整支援 Emoji 與多語言。_bin 或 _cs 校對。SHOW VARIABLES LIKE 'character_set%';、SHOW VARIABLES LIKE 'collation%'; 檢視當前實例設定。SHOW COLLATION LIKE 'utf8mb4%';
-- 或指定字符集
SHOW COLLATION WHERE Charset = 'utf8mb4';