MySQL 中文亂碼本質是「編碼鏈路不一致」。本文彙總「伺服器配置 → 連接參數 → 建庫語句 → 會話指令」四層統一策略,針對 Windows/Linux、MySQL 4.x/5.x/8.x、JDBC/PHP/命令列等多環境給出標準化解決方案,附帶驗證指令與常見誤區。
資料庫 ←→ 連接 ←→ 應用 ←→ 瀏覽器,每一環編碼必須完全一致。
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
# skip-character-set-client-handshake # 強制忽略客戶端編碼請求,慎用
修改後 必須重啟 MySQL 服務 生效。
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE TABLE t (c VARCHAR(100)) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
避免依賴伺服器預設值,顯式聲明最保險。
| 環境 | 配置範例 |
|---|---|
| JDBC (MySQL 5.0+) | |
| JDBC (8.0+) | |
| PHP (mysqli) | |
| PHP (PDO) | |
| 命令列會話 | |
| Python (MySQLdb) |
SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb4 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
八個 character_set_* 全為 utf8mb4 (除 filesystem) 即為完全一致。
# 進入 MySQL 前執行
chcp 65001 # 切換代碼頁到 UTF-8
mysql -u root -p --default-character-set=utf8mb4
| 誤區 | 後果 | 正確做法 |
|---|---|---|
| 只改 my.ini 不重啟 | 配置不生效 | 修改後必須 restart service |
| 只設連接字串不改庫編碼 | 新表仍用預設 latin1 | 建庫/建表顯式 CHARSET=utf8mb4 |
| 用 utf8 而非 utf8mb4 | Emoji/生僻字存成 ?? | 全鏈路 utf8mb4 (5.5.3+) |
| SET NAMES 'utf8' (無 mb4) | 截斷 4 字節字符 | SET NAMES 'utf8mb4' |
| PHP header() 設編碼但 DB 連接未設 | 讀出亂碼 | mysqli_set_charset / PDO charset 參數 |
useUnicode=true&characterEncoding=gbk/utf8characterEncoding=utf8 即可,useUnicode 可省略utf8mb4,建議全面遷移utf8mb4、caching_sha2_password,驅動需 8.0+「my.ini 三段配置 + 建庫顯式編碼 + 連接字串 charset + 會話 SET NAMES」四步走,配合 SHOW VARIABLES LIKE 'character%' 驗證,MySQL 中文亂碼問題可徹底根治。建議將此流程寫入團隊《資料庫交付檢查清單》,新環境部署逐項打勾。