中文亂碼本質是編碼不一致:客戶端編碼、連接層編碼、服務端內部編碼、結果集編碼任一環節不匹配即產生亂碼。
[客戶端編碼] --(發送)--> [連接層編碼] --(轉換)--> [服務端內部編碼] --(存儲/讀取)--> [結果集編碼] --(返回)--> [客戶端顯示] GBK (DOS) utf8/gbk utf8/gbk utf8/gbk GBK (DOS)
關鍵系統變量:
character_set_client:客戶端發送語句的編碼。character_set_connection:Server 將接收到的語句轉換為此編碼解析。character_set_database/table/column:數據存儲編碼。character_set_results:結果集返回給客戶端的編碼。character_set_server:默認庫/表編碼。SHOW VARIABLES LIKE 'character_set_%';
重點觀察 client、connection、results、database、server 是否一致。
SET character_set_client = gbk;
SET character_set_connection = utf8;
SET character_set_results = gbk;
-- 或一鍵
SET NAMES gbk; -- 等同於以上三條
[client]
default-character-set = gbk # 客戶端默認編碼
[mysql]
default-character-set = gbk # mysql 命令行客戶端
[mysqld]
character-set-server = utf8 # 服務端默認存儲編碼
collation-server = utf8_general_ci
修改後必須重啟 MySQL 服務生效。
character_set_client 應設為 gbk。utf8mb4。utf8mb4。SET NAMES utf8mb4(或驅動屬性 characterEncoding=utf8mb4)。Content-Type: text/html; charset=utf-8。utf8mb4。SET NAMES utf8mb4(客戶端、連接層、結果集三統一)。遵循三統一,徹底告別中文亂碼。