在 Windows CMD 下使用 MySQL 客戶端查詢中文資料時,常見亂碼現象。根因是客戶端輸出視窗字符集(character_set_results)與作業系統預設編碼(中文 Windows 為 GBK/CP936)不匹配。本文提供診斷指令、臨時切換方案、永久配置建議,並解釋為何 utf8 在此場景下反而導致亂碼。
查詢含中文欄位的表:
SELECT * FROM user_info;
輸出中文欄位顯示為亂碼(如 ???、涓婂競 等)。
SHOW VARIABLES LIKE 'char%';
典型輸出:
+--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 ← 關鍵:輸出視窗編碼 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
結論: 伺服器端全為 utf8,但 Windows CMD 預設代碼頁為 936 (GBK),無法正確渲染 UTF-8 位元組流,故顯示亂碼。
SET character_set_results = gbk;
或完整設定三件套:
SET NAMES gbk;
效果: 立即生效,重新查詢中文正常顯示。缺點:重新連線失效。
修改 my.ini [mysql] 區段(客戶端工具預設):
[mysql] default-character-set = gbk
或在 [client] 區段設定(影響所有客戶端連接):
[client] default-character-set = gbk
重啟 MySQL 服務或重新開啟客戶端生效。
chcp 65001 且字型設為 TrueType(如 Consolas、NSimSun),且仍有游標定位、選取複製等已知 Bug。characterEncoding=utf8,由驅動自動轉碼,不依賴客戶端視窗編碼。chcp 65001Consolas 或 NSimSunSET NAMES utf8 或配置檔設 default-character-set=utf8| 場景 | 建議字符集設定 |
|---|---|
| Windows CMD 手工查詢 | SET NAMES gbk 或 my.ini [mysql] default-character-set=gbk |
| Java/JDBC 應用 | URL: ?useUnicode=true&characterEncoding=utf8 |
| Python (PyMySQL/mysqlclient) | charset='utf8mb4' |
| Go (go-sql-driver/mysql) | DSN: charset=utf8mb4,parseTime=True |
| 資料庫伺服器存儲 | my.ini [mysqld] character-set-server=utf8mb4 |
MySQL 客戶端視窗亂碼本質是「輸出編碼(character_set_results)與終端機渲染編碼不匹配」。Windows CMD 下最簡單有效的方案是將客戶端輸出設為 gbk;應用程式層面統一使用 utf8mb4 並在連接參數顯式指定編碼。切勿混淆「存儲編碼」與「傳輸/顯示編碼」兩個層面。