首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Java 操作 MySQL 中文亂碼終極解決:ISO-8859-1 轉碼陷阱與正確姿勢

     編輯:MySQL 資料庫相關知識

早期 Java + MySQL(Connector/J 3.x/5.0 時代)中文亂碼高發,許多開發者採用「寫入不轉碼、讀出轉 ISO-8859-1」的 Bean 封裝大法。本文剖析該方案的本質缺陷,給出現代 JDBC 連接參數一站式解決方案。

歷史方案回顧:Bean 級轉碼封裝

// 工具類:嘗試將字符串按 ISO-8859-1 重新解碼
public class Format2Chinese {
    public String format2ISO8859(String str) {
        if (str == null || str.trim().isEmpty()) return "";
        try {
            // 錯誤示範:getBytes("ISO-8859-1") 再用平台默認編碼構造 String
            // 正確應為:new String(str.getBytes("ISO-8859-1"), "GBK/UTF-8")
            return new String(str.getBytes("ISO-8859-1"));
        } catch (Exception e) { e.printStackTrace(); return str; }
    }
}

// Bean 中調用
public class LeaveMsg {
    private String msg;
    private boolean format = false;
    private Format2Chinese fn = new Format2Chinese();
    public void setMsg(String msg) {
        this.msg = format ? fn.format2ISO8859(msg) : msg;
    }
    // getter...
}

為什麼這是反模式?

  1. 雙重編碼損壞:str.getBytes("ISO-8859-1") 按單字節截斷多字節字符,再用平台默認編碼(GBK/UTF-8)構造 String,產生的字符串已不可逆損壞。
  2. 業務代碼侵入:每個 Bean、每個字段都需判斷 format 旗標,維護成本極高。
  3. 只治標不治本:根因是 JDBC 連接層字符集協商失敗,應在連接層統一解決。

現代最佳實踐:連接 URL 參數統一字符集

MySQL 5.1+ / Connector/J 5.1+(推薦)

jdbc:mysql://host:3306/dbname?
    useUnicode=true&
    characterEncoding=utf8&
    connectionCollation=utf8mb4_general_ci&
    serverTimezone=Asia/Shanghai
  • useUnicode=true:啟用 Unicode 支持。
  • characterEncoding=utf8:客戶端/服務端通信編碼(MySQL 端對應 utf8mb4)。
  • connectionCollation:連接校對規則,避免隱式轉換。

MySQL 8.0+ / Connector/J 8.0+(默認已優化)

jdbc:mysql://host:3306/dbname?serverTimezone=Asia/Shanghai
  • 默認 characterEncoding=UTF-8、useUnicode=true、connectionCollation=utf8mb4_0900_ai_ci,**通常無需額外參數**。

服務端配置同步(/etc/my.cnf)

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
# 或 utf8mb4_general_ci(舊版兼容)

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

驗證清單

  1. SHOW VARIABLES LIKE 'character_set%'; → 除 filesystem 外全為 utf8mb4。
  2. SHOW VARIABLES LIKE 'collation%'; → 全為 utf8mb4_0900_ai_ci 或 utf8mb4_general_ci。
  3. JSP/HTML 頁面 ``,保存文件為 UTF-8 無 BOM。
  4. 應用層不再做任何手動 getBytes/ new String 轉碼。

遷移清單(舊專案)

  1. 移除所有 Bean 中的 Format2Chinese 調用。
  2. 更新 JDBC URL 參數。
  3. 確認數據庫/表/列字符集為 utf8mb4(ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4)。
  4. 全鏈路壓測:中文、Emoji、生僻字(𠮷𠮷𠮷)寫入/讀出/檢索/排序。

**結論**:拋棄 Bean 級轉碼大法,擁抱 JDBC 連接參數 + 服務端統一 utf8mb4,是解決 Java-MySQL 中文亂碼的**唯一正確、可維護、高性能**路徑。

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