核心概念
| 術語 | 定義 |
| 字符集 | 符號集合與編碼映射(如 utf8:1-3 字節,utf8mb4:1-4 字節支援 Emoji) |
| 校對規則 | 字符集內比較、排序規則(如 utf8_general_ci 不分大小寫,utf8_bin 二進制比較) |
| 命名慣例 | <charset>_<language>_<suffix>,後綴:_ci不敏感、_cs敏感、_bin二進制 |
四級默認層級
- 服務器級:
character_set_server、collation_server
- 資料庫級:
CREATE DATABASE db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 表級:
CREATE TABLE t (...) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
- 連接級:
SET NAMES utf8mb4; 或連線參數 characterEncoding=utf8mb4
優先級:連接 > 表 > 資料庫 > 服務器。
常見校對規則對比
| 校對規則 | 特性 | 適用場景 |
utf8mb4_general_ci | 速度快、不分大小寫、不支援多語言精細排序 | 通用業務、舊專案相容 |
utf8mb4_unicode_ci | 遵循 Unicode 標準、支援多語言排序、略慢 | 多語言應用、精確排序需求 |
utf8mb4_0900_ai_ci | 8.0 預設、基於 Unicode 9.0、支援表情符號權重 | MySQL 8.0+ 新專案首選 |
utf8mb4_bin | 二進制比較、嚴格區分大小寫、效能最高 | 大小寫敏感業務、索引精確匹配 |
實戰建議
- ✅ **新專案統一使用
utf8mb4 + utf8mb4_0900_ai_ci(8.0)或 utf8mb4_unicode_ci(5.7)**
- ✅ 連接層強制設定:
SET NAMES utf8mb4 / JDBC characterEncoding=utf8mb4 / PHP mysqli_set_charset($link, 'utf8mb4')
- ✅ 避免隱式轉換:建表、建庫顯式指定 CHARSET/COLLATE,不依賴默認值。
- ⚠️
utf8(MySQL 別名)實為 utf8mb3,**不支援 Emoji/補充平面字符**,必須遷移至 utf8mb4。
- ⚠️
utf8_general_ci 會將 ß = ss、œ = oe 等視為相等,若需嚴格區分請用 _bin 或 _unicode_ci。
查看與診斷指令
SHOW CHARACTER SET;
SHOW COLLATION LIKE 'utf8mb4%';
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';
SELECT CHARSET(column), COLLATION(column) FROM table LIMIT 1;
遷移 utf8 → utf8mb4 檢查清單
- 修改
my.cnf:character-set-server=utf8mb4、collation-server=utf8mb4_unicode_ci
ALTER DATABASE db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 檢查索引長度:
VARCHAR(255) 在 utf8mb4 佔 767 字節,InnoDB 單列索引限制 767(5.7)或 3072(8.0),超長需調整列長度或啟用 innodb_large_prefix=ON。
- 應用層連接參數同步修改。