微信開發中獲取用戶暱稱含 Emoji 表情導致 MySQL 存儲變 ??,根因是字元集不支援 4 字節字符。本文提供從配置檔、連線參數、資料庫/表/欄位層面的完整 utf8mb4 遷移方案。
utf8 僅支援 3 字節字符 (BMP 平面),Emoji 屬於 4 字節補充平面Incorrect string value?? 或亂碼[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 # 強制忽略客戶端字元集設定
service mysql restart # 或 systemctl restart mysqld
⚠️ 若啟動失敗檢查錯誤日誌,常見原因:舊版本不支援 utf8mb4_unicode_ci,改用 utf8mb4_general_ci。
SHOW VARIABLES LIKE 'character_set_%'; SHOW VARIABLES LIKE 'collation_%'; STATUS; -- 查看連線字元集
-- 資料庫層面 ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- 表層面 (含所有字串欄位) ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 單欄位修改 ALTER TABLE tbl_name CHANGE col_name col_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
注意: utf8mb4 索引長度限制 767 bytes (InnoDB 預設),VARCHAR(191) 為安全長度 (191×4=764)。開啟 innodb_large_prefix=ON + innodb_file_format=Barracuda 可支援 3072 bytes。
| 語言/框架 | 連線參數範例 |
|---|---|
| JDBC (MySQL 5.1.38+) | jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useUnicode=true |
| PHP PDO | new PDO("mysql:host=...;dbname=...;charset=utf8mb4", $user, $pass) |
| Python PyMySQL | pymysql.connect(charset='utf8mb4') |
| Go sqlx | db, _ = sqlx.Open("mysql", "user:pass@tcp(host:3306)/db?charset=utf8mb4") |
mysqldump --default-character-set=utf8mb4 導出