CREATE DATABASE `db_name`
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci; -- 或 utf8mb4_unicode_ci
| 組合 | 特點 | 適用場景 |
|---|---|---|
utf8mb4_general_ci | 速度快、排序簡單(按字符碼點),不區分德語 ß/ss 等 | 通用業務、高併發、不需嚴格多語言排序 |
utf8mb4_unicode_ci | 遵循 UCA(Unicode Collation Algorithm),多語言排序準確 | 國際化產品、多語言排序、嚴格語義正確性要求 |
utf8mb4_0900_ai_ci (8.0+) | 基於 Unicode 9.0,支援表情符號排序、重音不敏感 | MySQL 8.0 新項目首選,最現代 |
-- 查看庫字符集
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='db_name';
-- 修正已有庫
ALTER DATABASE `db_name` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
my.cnf[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
# init_connect='SET NAMES utf8mb4' -- 要求客戶端無 SUPER 權限時慎用
jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useSSL=falsecharset='utf8mb4'db.SetConnMaxLifetime(time.Hour); db.Exec("SET NAMES utf8mb4")charset=utf8mb4 in DSN| 項目 | utf8 (MySQL 別名 utf8mb3) | utf8mb4 |
|---|---|---|
| 最大字節/字符 | 3 | 4 |
| 支援 Emoji | ❌ 存入報錯或截斷 | ✅ 完整支援 |
| 支援生僻漢字 | ❌ 僅 BMP 平面 | ✅ 含擴展平面 |
| 索引前綴長度限制 | 767 字節 → 255 字符 | 767 字節 → 191 字符(需 innodb_large_prefix 放寬至 3072/768) |
結論:**全鏈路強制 utf8mb4**,棄用 utf8。
SELECT CONCAT('ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA IN ('db1','db2') AND TABLE_TYPE='BASE TABLE';
大表生產環境請用 pt-online-schema-change 或 gh-ost 在線遷移。