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

解決 Java + MySQL 中文亂碼:編碼轉換與配置最佳實踐

     編輯:MySQL 綜合教學

解決 Java + MySQL 中文亂碼:編碼轉換與配置最佳實踐

中文亂碼是 Java 應用對接 MySQL 時最常見的坑。根因在於 MySQL 預設字符集為 latin1 (ISO-8859-1),而 Java 內部使用 Unicode (UTF-16)。當無法修改資料庫配置(如共享主機、受管雲資料庫)時,必須在應用層透過編碼轉換解決。

一、寫入資料:將 Java 字串轉為 ISO-8859-1

錯誤示範:直接 pstmt.setString(1, "中文"),資料庫呈現 ??。

正確做法:在寫入前手動轉碼:

String str = "中文";
// 關鍵步驟:將 Unicode 字串按 ISO-8859-1 重新編碼
str = new String(str.getBytes(), "ISO8859_1");

String sql = "INSERT INTO Tb (xxx) VALUES (?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, str);
pstmt.executeUpdate();

getBytes() 無參數時使用平台預設編碼(通常為 UTF-8),再用 ISO8859_1 解碼,產生的字串在 MySQL 視為 latin1 正確存儲。

二、讀取資料:從 ISO-8859-1 還原為 Java 內部編碼

String str = rs.getString(1);
// 方式一:還原為平台預設編碼(通常 UTF-8)
str = new String(str.getBytes("ISO8859_1"));

// 方式二:指定目標編碼(如 GBK)
str = new String(str.getBytes("ISO8859_1"), "GBK");

原理:從資料庫讀回的字串實際為 latin1 位元組序列,先用 getBytes("ISO8859_1") 取回原始位元組,再按目標編碼解碼。

三、根治方案:配置層面徹底解決(推薦)

若擁有資料庫控制權,應從源頭修正:

  1. 資料庫/表/欄位字符集:ALTER DATABASE db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  2. 連線 URL 參數:jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8&autoReconnect=true
  3. MySQL 配置 (my.cnf):
    [client]
    default-character-set = utf8mb4
    [mysql]
    default-character-set = utf8mb4
    [mysqld]
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci

採用 utf8mb4 可完整支援 Emoji 及補充字符。

四、常見誤區提醒

  • 不要混用:應用層轉碼與連線參數 characterEncoding=utf8 同時使用會導致雙重編碼,反而產生亂碼。
  • 確認驅動版本:MySQL Connector/J 5.1.47+ / 8.0+ 對 UTF-8 支援最佳。
  • 檢查控制台/日誌編碼:IDE、終端、日誌檔案編碼必須一致,否則「看起來是亂碼」可能只是顯示層問題。

總結:無法改配置時,應用層 ISO8859_1 轉碼是救命稻草;有權限時,統一全鏈路 utf8mb4 才是正道。

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