首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MySQL JDBC 中文亂碼終極解決:client/connection/results 編碼統一 + CMD 代碼頁設置

     編輯:程式設計綜合問答

經典場景: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 連接字符串標準配置

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 編碼)

MySQL 服務端配置

# 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 字節 (不支持補充平面)。

CMD 終端亂碼解決 (Windows)

問題現象

  • CMD 默認代碼頁 936 (GBK)
  • MySQL 客戶端按 character_set_client 解碼輸入,按 character_set_results 編碼輸出
  • 若連接指定 UTF-8,但 CMD 是 GBK → 顯示亂碼

方案一:臨時切換 CMD 代碼頁 (不支持中文輸入)

chcp 65001
# 字體設置為 Consolas / NSimSun / 微軟雅黑 (屬性→字體)
mysql -u root -p

缺點:chcp 65001 下無法輸入中文,退出需 chcp 936。

方案二:MySQL 客戶端指定字符集 (推薦)

# 登錄時指定
mysql -u root -p --default-character-set=gbk
# 或登錄後
mysql> SET NAMES gbk;
# 或
mysql> CHARSET gbk;  -- 同義

優點:CMD 保持 GBK,MySQL 客戶端按 GBK 收發,完美支持中文輸入顯示。

方案三:使用現代終端 (最佳體驗)

  • Windows Terminal + PowerShell 7+:原生 UTF-8,完美支持中文、Emoji、顏色
  • Git Bash / WSL2:Linux 風格,UTF-8 默認
  • DataGrip / DBeaver / Navicat:GUI 工具,內部處理編碼轉換,無感知

驗證命令

# 登錄後查看會話編碼
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

避坑總結

  1. JDBC URL **必須**雙向指定編碼 (characterEncoding + characterSetResults)
  2. MySQL 服務端 **必須**設置 character-set-server=utf8mb4
  3. CMD 下 **不要**硬用 chcp 65001,改用 SET NAMES gbk 或換現代終端
  4. 表/列級編碼 CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci 顯式聲明
  5. 全鏈路統一 utf8mb4,拒絕 utf8 (3字節) 和 latin1

一句話:客戶端、連接、結果集、終端,四碼合一,亂碼自消。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved