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

解決 JDBC 插入 MySQL 中文亂碼:連線字串需加 useUnicode & characterEncoding

     編輯:MySQL 綜合教學

問題現象

Java 應用透過 JDBC 向 MySQL 插入中文,資料庫欄位、表、庫皆設為 `utf8`/`utf8mb4`,但儲存後變為 `???` 或亂碼。

根本原因

JDBC 驅動預設連線字符集非 UTF-8 (舊版為 `latin1`),連線層面未指定編碼,導致驅動以錯誤編碼將 Java `String` (UTF-16) 轉換為位元組送入 MySQL。

解決方案:修正 JDBC URL

-- 錯誤範例
jdbc:mysql://localhost:3306/your_db

-- 正確範例 (MySQL Connector/J 5.1+)
jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=utf8mb4

-- 完整推薦參數 (生產環境)
jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=utf8mb4&zeroDateTimeBehavior=convertToNull&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true

參數說明

  • `useUnicode=true`:啟用 Unicode 支援
  • `characterEncoding=utf8mb4`:指定連線傳輸編碼為 UTF-8 (4 字節),支援 Emoji
  • `zeroDateTimeBehavior=convertToNull`:處理 `0000-00-00` 日期
  • `serverTimezone=UTC`:避免時區警告,統一時區
  • `useSSL=false`:內網環境關閉 SSL 減少開銷
  • `allowPublicKeyRetrieval=true`:MySQL 8.0 `caching_sha2_password` 需公開金鑰

程式碼範例

String url = "jdbc:mysql://localhost:3306/news?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=UTC";
String user = "root";
String pass = "123";

Connection con = DriverManager.getConnection(url, user, pass);
// 或一次寫死
// Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/news?user=root&password=123&useUnicode=true&characterEncoding=utf8mb4");

驗證

try (PreparedStatement ps = con.prepareStatement("INSERT INTO test (content) VALUES (?)")) {
    ps.setString(1, "測試中文 😀");
    ps.executeUpdate();
}
// 資料庫查詢應正確顯示 "測試中文 😀"

補充:MySQL 8.0 + Connector/J 8.0 預設行為

  • Connector/J 8.0 預設 `characterEncoding=utf8mb4`,但強烈建議顯式指定,避免版本升級行為變更
  • MySQL 8.0 預設認證插件 `caching_sha2_password`,舊驅動不支援,需加 `allowPublicKeyRetrieval=true` 或改用 `mysql_native_password`

總結

資料庫設定 utf8mb4 只是儲存端正確;JDBC 連線字串必須加 `useUnicode=true&characterEncoding=utf8mb4` 才能保證傳輸端正確。 這是 Java 連 MySQL 中文亂碼 99% 的解藥。

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