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

MySQL 5.x 中文亂碼終極解決:JDBC URL characterEncoding 與連線層三參數

     編輯:MySQL 資料庫相關知識

現象

應用寫入中文存為亂碼,但 phpMyAdmin/EMS 等工具寫入正常,且應用讀取自己寫入的資料卻能正常顯示(雙重錯誤抵消)。

根因

JDBC URL 缺少 characterEncoding,驅動預設用 ISO-8859-1 (latin1) 編碼 SQL 發送給伺服器,伺服器同樣以 latin1 解碼存儲。實際流程:

應用(UTF-8/GBK) → JDBC 驅動(預設 latin1 編碼) → 伺服器(latin1 解碼存儲) → 亂碼落盤

驗證連線層編碼

public void select() throws SQLException {
    ResultSet rs = cnn.createStatement().executeQuery(
        "SHOW VARIABLES LIKE 'character_set_%'");
    while (rs.next()) {
        System.out.println(rs.getString(1) + "," + rs.getString(2));
    }
    rs.close();
}

未配置時:character_set_client=latin1、character_set_connection=latin1。
配置後:均變為 utf8 (或 gbk/gb2312)。

正確 JDBC URL

jdbc:mysql://10.4.2.52:3306/srx?useUnicode=true&characterEncoding=utf-8
# 或 gbk / gb2312,視應用編碼而定

兩參數緊湊相連,無空格,& 在 XML 中需轉義為 &。

伺服器端配合

[mysqld]
default-character-set = utf8   # 5.5+ 建議 utf8mb4
collation-server = utf8_general_ci

[mysql]
default-character-set = utf8

重啟服務。應用連線建立後首句仍建議執行 SET NAMES utf8(驅動 5.1.13+ 已自動處理,但顯式無害)。

常見誤區

誤區事實
只加 useUnicode=true無 characterEncoding 仍退回 latin1
伺服器 default-character-set=utf8 就夠了連線層編碼由客戶端決定,伺服器預設不覆蓋
工具能寫入說明伺服器沒問題工具自帶連線層編碼配置,與應用無關

總結

JDBC URL 必須同時指定 useUnicode=true&characterEncoding=你的應用編碼,連線層三參數 (client/connection/results) 即會統一,中文亂碼徹底消失。

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