首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 連接 MySQL 亂碼終極解決方案:五大層面徹底修正編碼鏈路

     編輯:Java 程式設計入門

亂碼本質:編碼鏈路任一環節不一致

資料流向:資料庫存儲 → JDBC 驅動 → JVM 字串 → Web 容器 → 瀏覽器渲染。任一環節編碼不匹配,即產生亂碼。系統性解決需從五個層面入手。

層面一:資料庫與表級編碼設定 (源頭)

-- my.cnf / my.ini (MySQL 服務端配置)
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

重啟 MySQL 生效。建表時顯式指定:

CREATE TABLE `company` (
  `cname` VARCHAR(10) NOT NULL,
  `caddr` VARCHAR(100),
  `ctel` VARCHAR(16)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

推薦 utf8mb4:支援完整 Unicode (含 Emoji),utf8 僅支援 BMP 平面 (3 字節),utf8mb4 為 4 字節真正完整 UTF-8。

層面二:JDBC 連接 URL 顯式指定編碼 (傳輸層)

String url = "jdbc:mysql://localhost:3306/mydb?" +
             "useUnicode=true&" +
             "characterEncoding=utf8mb4&" +
             "serverTimezone=Asia/Shanghai&" +
             "useSSL=false&" +
             "allowPublicKeyRetrieval=true";

Connection conn = DriverManager.getConnection(url, "user", "pass");
  • useUnicode=true:告知驅動使用 Unicode 編碼交互。
  • characterEncoding=utf8mb4:指定網路傳輸編碼,必須與資料庫一致。
  • MySQL 8.0+ 驅動預設已支援 utf8mb4,舊版驅動 (5.x) 需額外加 characterSetResults=utf8mb4。

層面三:Web 容器與 JSP/Filter 編碼統一 (應用層)

1. JSP 頁面指令

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

2. 全域過濾器 (web.xml) - 強制請求/響應編碼

<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!-- Spring 提供 -->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value> <!-- 強制覆蓋 -->
    </init-param>
</filter>
<filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

無 Spring 專案可自寫簡易 Filter:request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");。

3. Tomcat 連接器編碼 (server.xml)

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8"
           useBodyEncodingForURI="true" />

層面四:Java 代碼層面的編碼轉換 (補救/兼容舊系統)

若無法修改上游 (如舊系統 ISO-8859-1 存儲),在讀取時強制轉碼:

// 讀取請求參數 (GET 請求常見問題)
String name = request.getParameter("name");
if (name != null) {
    name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
}

// 讀取資料庫結果集
String dbValue = rs.getString("column_name");
// 若驅動未正確解碼,嘗試
String fixed = new String(dbValue.getBytes("ISO-8859-1"), "UTF-8");

警告:這是治標不治本,會增加 CPU 開銷且易出錯。務必優先修正層面一~三。

層面五:前端與瀏覽器 (呈現層)

  • HTML 頁面頭部:<meta charset="UTF-8">
  • AJAX 請求:$.ajax({ contentType: "application/x-www-form-urlencoded; charset=UTF-8", ... }) 或 xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8")
  • 表單提交:<form accept-charset="UTF-8">

快速排查清單 (按順序驗證)

  1. ☐ 資料庫/表/欄位 `CHARSET=utf8mb4`?
  2. ☐ JDBC URL 含 `characterEncoding=utf8mb4`?
  3. ☐ Tomcat `URIEncoding="UTF-8"`?
  4. ☐ Filter 強制 `UTF-8` 且映射 `/*`?
  5. ☐ JSP/HTML 頁面宣告 `UTF-8`?
  6. ☐ 瀏覽器開發者工具 Network 面板確認 Request/Response Headers 含 `charset=UTF-8`?

常見誤區與避坑

誤區正確做法
以為 `utf8` 就夠了必須用 `utf8mb4` 支援 Emoji/生僻字
只在 JSP 加 pageEncoding需全鏈路一致,缺一不可
GET 請求中文亂碼用 POST 解決GET 請求依賴 Tomcat `URIEncoding`,POST 依賴 Filter/Request 編碼
MySQL 8.0 仍用舊驅動類 `com.mysql.jdbc.Driver`必須升級為 `com.mysql.cj.jdbc.Driver` 並加 `serverTimezone`

總結

亂碼問題 90% 源於編碼鏈路不一致。建立標準化部署清單:資料庫 utf8mb4 → JDBC 顯式指定 → Tomcat URIEncoding → 全域 Filter 強制 UTF-8 → 頁面 Meta 聲明。一次配置到位,永久告別亂碼困擾。

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