MySQL 中文亂碼問題的核心在於三層字符集的一致性:表/列定義、連接參數、服務端默認設置。本文系統梳理排查步驟與永久修復方案。
使用以下命令查看建表語句或列詳細信息:
SHOW CREATE TABLE t1;
-- 或
SHOW FULL COLUMNS FROM t1;
關鍵點:確保目標列(如 c1 varchar(30))的 Collation 為中文兼容字符集,常見選項:
gbk / gbk_chinese_ci(簡體中文,最常用)utf8 / utf8_general_ci(Unicode,推薦新項目)gb2312、big5(較舊標準)SHOW VARIABLES LIKE 'char%';
重點關注三個「連接三參」:
| 參數 | 含義 |
|---|---|
character_set_client | 客戶端發送數據的編碼 |
character_set_connection | 服務端接收後轉換的編碼 |
character_set_results | 結果集返回給客戶端的編碼 |
這三者必須與表/列字符集一致,否則會在轉換環節產生亂碼。
會話級臨時生效(斷開失效):
SET NAMES 'gbk'; -- 或 utf8
-- 等同於同時設置:
-- SET character_set_client = gbk;
-- SET character_set_connection = gbk;
-- SET character_set_results = gbk;
編輯 my.cnf(Linux)或 my.ini(Windows),在 [mysqld] 與 [client] 區塊添加:
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
注意:修改後需重啟 MySQL 服務(service mysqld restart)。
character_set_database)僅影響新建表的默認值,不影響現有表。character_set_system)固定為 utf8,不可修改,用於標識符存儲。ALTER TABLE ... CONVERT TO CHARACTER SET ... 重新轉換數據。掌握「表定義、連接參數、配置文件」三位一體,中文亂碼將不再是難題。