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

MySQL 中文亂碼終極解決:Servlet + JDBC + 資料庫三層編碼鏈路修復

     編輯:MySQL 綜合教學

MySQL 中文亂碼終極解決:Servlet + JDBC + 資料庫三層編碼鏈路修復

中文亂碼是 Java Web 開發永恆痛點。本文從資料庫層、JDBC 連線層、Servlet 處理層、JSP 前端層四個環節,系統梳理 UTF-8 全鏈路配置標準,徹底根治亂碼。

一、資料庫層:表/欄位編碼統一為 utf8mb4

-- 檢視當前編碼
SHOW VARIABLES LIKE 'character_set_%';
SHOW CREATE TABLE your_table;

-- 修改資料庫預設編碼
ALTER DATABASE your_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

-- 修改表編碼
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

-- 修改單一欄位編碼
ALTER TABLE your_table MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
⚠️ 強烈建議用 utf8mb4 而非 utf8:MySQL 的 utf8 僅支援 3 位元組字符(BMP 平面),無法儲存 Emoji、生僻字;utf8mb4 完整支援 4 位元組 Unicode。

二、JDBC 連線層:URL 參數強制指定編碼

jdbc:mysql://localhost:3306/your_db?
  useUnicode=true&
  characterEncoding=utf8&
  useSSL=false&
  serverTimezone=Asia/Shanghai&
  allowPublicKeyRetrieval=true
  • useUnicode=true:啟用 Unicode 支援
  • characterEncoding=utf8:驅動程式以 UTF-8 編碼傳輸資料(實際對應 utf8mb4)
  • useSSL=false:本地開發關閉 SSL 減少握手延遲
  • serverTimezone:避免時區解析警告

三、Servlet 處理層:請求/回應編碼過濾器

1. 全域編碼過濾器(web.xml 或 Spring 配置)

@WebFilter("/*")
public class EncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) 
            throws IOException, ServletException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");
        chain.doFilter(req, resp);
    }
}

2. POST 表單中文參數處理

Tomcat 8+ 預設已支援 UTF-8 POST 解析,舊版需在 server.xml <Connector> 加 URIEncoding="UTF-8"。

四、JSP 前端層:頁面指令與表單編碼

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

<form action="submit" method="post" accept-charset="UTF-8">
  <input name="chineseText" />
</form>

五、特殊場景:URL 參數傳遞中文(GET 請求)

GET 請求 URL 中文需雙重編碼/解碼:

// 前端 JS 編碼
var encoded = encodeURIComponent("中文參數");  // 或 encodeURI()

// 後端 Java 解碼
String decoded = URLDecoder.decode(request.getParameter("param"), "UTF-8");
現代瀏覽器預設以 UTF-8 發送 URL 編碼,若 Tomcat URIEncoding="UTF-8" 正確,通常無需手動解碼。僅在舊環境或代理層轉碼時需介入。

六、資料清理:Truncate 重置自增 ID

TRUNCATE TABLE your_table;
-- 快速清空表、釋放空間、自增計數器歸零
-- 注意:無法回滾、不觸發 Trigger、外鍵約束表不可用

七、排查清單:亂碼仍存在時逐項檢查

層級檢查項目正確值
資料庫character_set_database / table / columnutf8mb4
JDBC URLcharacterEncoding / useUnicodeutf8 / true
連線池connectionInitSqlsSET NAMES utf8mb4
Servletrequest.setCharacterEncodingUTF-8(在讀取參數前)
JSPpageEncoding / contentType / meta charsetUTF-8
Tomcatserver.xml Connector URIEncodingUTF-8
瀏覽器Content-Type 標頭 / meta charsetUTF-8
檔案Java/JS/HTML 檔案編碼UTF-8 無 BOM

總結

UTF-8 全鏈路無弱環:資料庫 utf8mb4 → JDBC URL 指定編碼 → Servlet 過濾器統一請求回應編碼 → JSP 頁面聲明 UTF-8 → Tomcat Connector URIEncoding=UTF-8 → 檔案儲存為 UTF-8。任一環節缺失皆可能導致亂碼,建議新專案啟動時即納入規範文檔與 CI 檢查。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved