MySQL 的 utf8 僅支援 BMP 平面(最多 3 字節),無法存儲 Emoji、生僻字等 4 字節字符。本文給出生產環境無停機遷移至 utf8mb4 的標準化操作步驟。
utf8mb4 真正實現 UTF-8,支援 4 字節字符ALTER TABLE c_comment
MODIFY COLUMN content VARCHAR(100)
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL;
mysqldump --default-character-set=utf8mb4 ...ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CONVERT TO 會同時轉換表默認字符集與所有字符列定義。
utf8mb4 最大 4 字節/字符,VARCHAR(255) 仍安全,但 CHAR(255) 可能超過行大小限制(65535 字節),需評估縮短或改 VARCHAR/TEXT。SHOW CREATE TABLE tbl_name\G
-- 檢查 CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
INSERT TEST VALUES ('😀🎉'); -- 驗證 4 字節寫入
| Collation | 特點 | 適用場景 |
|---|---|---|
| utf8mb4_unicode_ci | 基於 UCA 標準,多語言排序準確 | 通用推薦 |
| utf8mb4_general_ci | 舊版簡化排序,速度略快但準確性較低 | 舊系統兼容 |
| utf8mb4_0900_ai_ci | MySQL 8.0+ 預設,支援 ICU、加權排序 | 8.0+ 新項目首選 |
-- my.cnf / my.ini
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
skip-character-set-client-handshake
重啟服務生效,或動態設置:SET NAMES utf8mb4;(僅當前會話)。
utf8mb4 下單列索引前綴長度從 767 字節 → 3072 字節(需 innodb_large_prefix=ON + ROW_FORMAT=DYNAMIC/COMPRESSED)characterEncoding=utf8mb4(JDBC)或 charset=utf8mb4(Python/PHP)