中文亂碼是 Java Web 開發永恆痛點。本文從資料庫層、JDBC 連線層、Servlet 處理層、JSP 前端層四個環節,系統梳理 UTF-8 全鏈路配置標準,徹底根治亂碼。
-- 檢視當前編碼
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: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:避免時區解析警告@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);
}
}
Tomcat 8+ 預設已支援 UTF-8 POST 解析,舊版需在 server.xml <Connector> 加 URIEncoding="UTF-8"。
<%@ 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>
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 TABLE your_table;
-- 快速清空表、釋放空間、自增計數器歸零
-- 注意:無法回滾、不觸發 Trigger、外鍵約束表不可用
| 層級 | 檢查項目 | 正確值 |
|---|---|---|
| 資料庫 | character_set_database / table / column | utf8mb4 |
| JDBC URL | characterEncoding / useUnicode | utf8 / true |
| 連線池 | connectionInitSqls | SET NAMES utf8mb4 |
| Servlet | request.setCharacterEncoding | UTF-8(在讀取參數前) |
| JSP | pageEncoding / contentType / meta charset | UTF-8 |
| Tomcat | server.xml Connector URIEncoding | UTF-8 |
| 瀏覽器 | Content-Type 標頭 / meta charset | UTF-8 |
| 檔案 | Java/JS/HTML 檔案編碼 | UTF-8 無 BOM |
UTF-8 全鏈路無弱環:資料庫 utf8mb4 → JDBC URL 指定編碼 → Servlet 過濾器統一請求回應編碼 → JSP 頁面聲明 UTF-8 → Tomcat Connector URIEncoding=UTF-8 → 檔案儲存為 UTF-8。任一環節缺失皆可能導致亂碼,建議新專案啟動時即納入規範文檔與 CI 檢查。