首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

解決 Java 應用連接 MySQL 中文亂碼:全鏈路字符集配置最佳實踐

     編輯:MySQL 綜合教學

一、問題根因:字符集不匹配鏈路

Java → JDBC → MySQL 連線涉及三個關鍵字符集設置:

  • character_set_client:客戶端發送 SQL 的編碼
  • character_set_connection:Server 解析 SQL 的編碼
  • character_set_results:Server 返回結果集的編碼

任一環節不一致 → 亂碼。

二、MySQL 服務端配置(永久生效)

編輯 my.cnf / my.ini:

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

注意:[mysqld] 用 character-set-server,[client]/[mysql] 用 default-character-set,切勿混淆。

重啟驗證:

SHOW VARIABLES LIKE 'character%';

期望全部為 utf8mb4(除 character_set_filesystem=binary、character_set_system=utf8)。

三、資料庫/表/列級字符集

jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8mb4&autoReconnect=true&serverTimezone=Asia/Shanghai
  • useUnicode=true:啟用 Unicode 支持
  • characterEncoding=utf8mb4:指定傳輸編碼
  • connectionCollation=utf8mb4_unicode_ci:可選,指定連線校對規則

4.2 連接池層面統一設置

HikariCP:

dataSource.setConnectionInitSql("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci");

Druid:

dataSource.setConnectionInitSqls(Arrays.asList("SET NAMES utf8mb4"));

4.3 代碼層面兜底(不推薦作為主方案)

try (Connection conn = dataSource.getConnection();
     Statement stmt = conn.createStatement()) {
    stmt.execute("SET NAMES utf8mb4");  // 等同於設定 client/connection/results 三者
    // 執行業務查詢
}

五、驗證與排查清單

層級檢查命令/配置期望值
Server 全域SHOW VARIABLES LIKE 'character_set%';utf8mb4
SessionSHOW SESSION VARIABLES LIKE 'character_set%';utf8mb4
資料庫SHOW CREATE DATABASE db;CHARSET=utf8mb4
表SHOW CREATE TABLE t;CHARSET=utf8mb4
JDBC URL檢查連接字符串characterEncoding=utf8mb4
應用日誌啟用 SQL 日誌觀察實際發送字節無亂碼

六、常見坑點避雷

  1. utf8 vs utf8mb4:MySQL utf8 僅支援 BMP 平面(3 字節),**無法存儲 Emoji、生僻字**,必須用 utf8mb4
  2. SET NAMES utf8 在連接池複用場景下**不生效**(連接被複用前已設置),必須用 connectionInitSql
  3. my.cnf 中 [mysqld] 區段用 character-set-server 而非 default-character-set
  4. 舊表 latin1 存儲 UTF-8 數據(雙重編碼)需雙重轉換:CONVERT TO CHARACTER SET utf8mb4 前先 ALTER TABLE t CHANGE c c BLOB

七、總結

**全鏈路 utf8mb4** 是解決中文亂碼的唯一正解:

  1. Server:character-set-server=utf8mb4 + init_connect
  2. Client:default-character-set=utf8mb4
  3. DB/Table:CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  4. JDBC:characterEncoding=utf8mb4 + 連接池 connectionInitSql

一次配置,永久免疫亂碼。

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