MySQL重裝/遷移後出現亂碼,核心原因是字符集變量鏈路不一致。僅在會話執行SET NAMES utf8治標不治本,**必須在配置文件my.cnf/my.ini中固化character-set-server=utf8mb4**,覆蓋server與database級別預設值。
SHOW VARIABLES LIKE 'char%';
典型亂碼現狀:
| 變量 | 錯誤值 | 正確值 |
|---|---|---|
| character_set_client | gbk | utf8mb4 |
| character_set_connection | gbk | utf8mb4 |
| character_set_database | latin1 | utf8mb4 |
| character_set_results | gbk | utf8mb4 |
| character_set_server | latin1 | utf8mb4 |
| character_set_system | utf8 | utf8 |
[mysql]
# 客戶端默認字符集,影響 client/connection/results
default-character-set = utf8mb4
[mysqld]
# 服務端默認字符集,影響 database/server 新建對象
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 可選:強制客戶端握手字符集(防止駭客注入字符集指令)
skip-character-set-client-handshake
C:\ProgramData\MySQL\MySQL Server 5.x\my.ini 或安裝目錄)net stop mysql && net start mysqlsystemctl restart mysqldSHOW VARIABLES LIKE 'char%'; 確認 database 與 server 已為 utf8mb4
SET GLOBAL log_bin_trust_function_creators = 1;
-- 或配置文件 [mysqld] 段永久生效
log_bin_trust_function_creators = 1
否則報錯ERROR 1418: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA...
utf8(MySQL別名utf8mb3)僅支援BMP平面(3字節),**不支援Emoji、生僻漢字**(需4字節)utf8mb4完整支援Unicode 4字節,是現代應用**唯一正確選擇**utf8mb4單欄索引最大191字符(767/4),InnoDB innodb_large_prefix=ON(5.7.7+預設開)可放寬至3072字節?characterEncoding=utf8mb4&useUnicode=truecharset=utf8mb4ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;配置文件固化 utf8mb4,是 MySQL 字符集治理的「一勞永逸」鐵律。