經典場景:Navicat/JDBC 正常,CMD 下 chcp 65001 查詢亂碼,或直接進 MySQL 亂碼。核心原則:客戶端編碼 = 連接編碼 = 結果集編碼 = 終端編碼。
[Java App] --JDBC URL charset--> [MySQL Server] --character_set_results--> [CMD Terminal]
│ │ │
│ client_encoding │ connection_encoding │ chcp 代碼頁
▼ ▼ ▼
UTF-8 (代碼) UTF-8 (會話) UTF-8 / GBK (顯示)
jdbc:mysql://localhost:3306/dbname?
useUnicode=true&
characterEncoding=UTF-8&
characterSetResults=UTF-8&
zeroDateTimeBehavior=CONVERT_TO_NULL&
serverTimezone=Asia/Shanghai&
useSSL=false&
allowPublicKeyRetrieval=true
characterEncoding:客戶端發送 SQL 的編碼 (client)characterSetResults:服務端返回結果集編碼 (results)connectionCollation:連接校對規則 (隱含 connection 編碼)# my.cnf / my.ini
[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 生效。utf8mb4 支持 Emoji,utf8 僅 3 字節 (不支持補充平面)。
936 (GBK)character_set_client 解碼輸入,按 character_set_results 編碼輸出chcp 65001
# 字體設置為 Consolas / NSimSun / 微軟雅黑 (屬性→字體)
mysql -u root -p
缺點:chcp 65001 下無法輸入中文,退出需 chcp 936。
# 登錄時指定
mysql -u root -p --default-character-set=gbk
# 或登錄後
mysql> SET NAMES gbk;
# 或
mysql> CHARSET gbk; -- 同義
優點:CMD 保持 GBK,MySQL 客戶端按 GBK 收發,完美支持中文輸入顯示。
# 登錄後查看會話編碼
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';
# 關鍵變量必須一致
character_set_client = utf8mb4
character_set_connection = utf8mb4
character_set_results = utf8mb4
character_set_database = utf8mb4
character_set_server = utf8mb4
characterEncoding + characterSetResults)character-set-server=utf8mb4chcp 65001,改用 SET NAMES gbk 或換現代終端CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci 顯式聲明一句話:客戶端、連接、結果集、終端,四碼合一,亂碼自消。