MySQL 亂碼問題的核心在於「編碼不一致」。資料在客戶端、連線層、伺服器端、資料庫、資料表、欄位等多個層級流動,任一環節的字元集(Character Set)與排序規則不匹配,就會導致資料存入時被錯誤轉碼,或讀出時解碼錯誤。
SHOW VARIABLES LIKE 'character_set_server';SHOW CREATE DATABASE db_name;SHOW CREATE TABLE tbl_name;SHOW FULL COLUMNS FROM tbl_name;SHOW VARIABLES LIKE 'character_set_connection';、character_set_client、character_set_results在 my.cnf 或 my.ini 的 [mysqld] 區段設定預設字元集:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
重啟 MySQL 服務生效。
新建時指定:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE mytbl (col VARCHAR(255)) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
既有物件轉換:
ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE mytbl CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
應用程式連線時務必執行 SET NAMES utf8mb4(或使用驅動程式原生參數),確保 character_set_client、connection、results 三者一致。
若資料已以錯誤編碼存入(例如 latin1 存中文),需先確認原始位元組內容,再透過 CONVERT() 或雙重轉碼修正:
UPDATE tbl SET col = CONVERT(CAST(CONVERT(col USING latin1) AS BINARY) USING utf8mb4);
SELECT HEX(col), col FROM tbl LIMIT 10; 檢查實際位元組。遵循上述步驟,即可徹底解決 MySQL 亂碼問題,確保資料在存儲、傳輸、顯示全鏈路的編碼一致性。