應用寫入中文存為亂碼,但 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: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) 即會統一,中文亂碼徹底消失。