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

Java 連接 MySQL 亂碼問題完整解決方案(五大層面徹底根治)

     編輯:Java 相關知識

亂碼產生的五個關鍵層面

  1. 資料庫/表/欄位字符集
  2. JDBC 連接 URL 字符集參數
  3. Java 讀寫時的編碼轉換
  4. Web 容器/Filter 編碼過濾
  5. 頁面/JSP 聲明編碼

原則:全鏈路統一 UTF-8(或 GBK),任何一環不一致即亂碼。

方案一:資料庫層面配置 UTF-8

my.cnf / my.ini

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
init_connect='SET NAMES utf8'

重啟 MySQL 生效。

建表指定字符集

CREATE TABLE `Company` (
  `Cname` VARCHAR(10) NOT NULL,
  `Caddr` VARCHAR(100),
  `Ctel` VARCHAR(16)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

方案二:JDBC URL 顯式指定編碼(最關鍵)

String url = "jdbc:mysql://localhost:3306/test?"
    + "user=root&password=1"
    + "&useUnicode=true"
    + "&characterEncoding=utf-8"
    + "&autoReconnect=true"
    + "&serverTimezone=Asia/Shanghai";
Connection conn = DriverManager.getConnection(url);
  • useUnicode=true:啟用 Unicode 支持
  • characterEncoding=utf-8:指定傳輸編碼
  • MySQL 8.0+ 驅動默認 UTF-8,仍建議顯式聲明。

方案三:Java 代碼層面強制轉碼(救急方案)

// 讀取請求參數
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"), "UTF-8");

// 讀取 ResultSet
String dbValue = new String(rs.getString("col").getBytes("ISO-8859-1"), "UTF-8");

原理:JDBC 驅動默認按 ISO-8859-1 解碼字節,再按目標編碼重組。僅在方案二無效時使用,治標不治本。

方案四:Web.xml 配置字符編碼過濾器(全局攔截)

<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <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 Boot 只需配置:server.servlet.encoding.charset=UTF-8、server.servlet.encoding.force=true。

方案五:JSP/頁面聲明編碼

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

排查清單(由簡入深)

  1. 確認資料庫/表/欄位 CHARSET=utf8(SHOW CREATE TABLE)。
  2. JDBC URL 含 useUnicode=true&characterEncoding=utf-8。
  3. Tomcat server.xml <Connector URIEncoding="UTF-8" />。
  4. Web.xml 配置 CharacterEncodingFilter 且映射 /*。
  5. JSP 頁面指令 pageEncoding="UTF-8"。
  6. 瀏覽器開發者工具 Network 檢查 Response Headers: Content-Type: text/html;charset=UTF-8。
  7. 數據庫客戶端(Navicat/Workbench)顯示正常 → 問題在 Java/Web 層。

常見誤區

  • 以為 SET NAMES utf8 執行一次永久生效 → 僅對當前連接有效,需寫入 JDBC URL 或 init_connect。
  • MySQL 8.0 utf8mb4 才是真正 UTF-8,utf8 為 utf8mb3 別名,無法存 Emoji。建議全鏈路升級 utf8mb4。
  • Filter 順序錯誤:CharacterEncodingFilter 必須在其他讀取請求體的 Filter 之前。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved