首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 重裝後亂碼終極解決:配置文件強制 utf8mb4、字符集變量全鏈路對齊

     編輯:MySQL 資料庫相關知識

MySQL重裝/遷移後出現亂碼,核心原因是字符集變量鏈路不一致。僅在會話執行SET NAMES utf8治標不治本,**必須在配置文件my.cnf/my.ini中固化character-set-server=utf8mb4**,覆蓋server與database級別預設值。

診斷命令

SHOW VARIABLES LIKE 'char%';

典型亂碼現狀:

變量錯誤值正確值
character_set_clientgbkutf8mb4
character_set_connectiongbkutf8mb4
character_set_databaselatin1utf8mb4
character_set_resultsgbkutf8mb4
character_set_serverlatin1utf8mb4
character_set_systemutf8utf8

根治配置(Windows my.ini / Linux my.cnf)


[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

生效步驟

  1. 編輯配置文件(Windows:C:\ProgramData\MySQL\MySQL Server 5.x\my.ini 或安裝目錄)
  2. 重啟服務:
    • Windows:net stop mysql && net start mysql
    • Linux:systemctl restart mysqld
  3. 驗證:SHOW VARIABLES LIKE 'char%'; 確認 database 與 server 已為 utf8mb4

補充:創建 Function/Trigger 需開啟


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...

為何用 utf8mb4 而非 utf8?

  • utf8(MySQL別名utf8mb3)僅支援BMP平面(3字節),**不支援Emoji、生僻漢字**(需4字節)
  • utf8mb4完整支援Unicode 4字節,是現代應用**唯一正確選擇**
  • 索引長度限制:utf8mb4單欄索引最大191字符(767/4),InnoDB innodb_large_prefix=ON(5.7.7+預設開)可放寬至3072字節

應用層配合

  • JDBC連接串:?characterEncoding=utf8mb4&useUnicode=true
  • Python/PHP/Go ORM 設置 charset=utf8mb4
  • 舊數據遷移:ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

配置文件固化 utf8mb4,是 MySQL 字符集治理的「一勞永逸」鐵律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved