中文亂碼本質是編碼不一致:IDE 文件編碼、JSP/Servlet 處理編碼、JDBC 連接串編碼、MySQL 服務端編碼、數據庫/表/列定義編碼——任一環節不匹配即產生亂碼。
Window → Preferences → General → Workspace,Text file encoding 選 Other: UTF-8。Window → Preferences → MyEclipse → Files and Editors,將 ASP/PHP、CSS、DTD、HTML、JSP、XML 全部設為 UTF-8。JSP 頁面頂部:
<%@ page contentType="text/html;charset=UTF-8" %>
<% request.setCharacterEncoding("UTF-8"); %>
Servlet 通用過濾器(推薦):
public class EncodingFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
chain.doFilter(req, resp);
}
}
在 web.xml 註冊為首個 Filter,攔截所有路徑 /*。
XML 配置(Druid/HikariCP/MyBatis/Spring):
<property name="connection.url">
jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf8
</property>
Properties 文件:
jdbc.url=jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf8
關鍵參數說明:
useUnicode=true:啟用 Unicode 支持characterEncoding=utf8:告知驅動以 UTF-8 與服務端交互(MySQL 5.5+ 推薦 utf8mb4)autoReconnect=true:自動重連(生產環境建議由連接池管理)[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect = 'SET NAMES utf8mb4'
skip-character-set-client-handshake # 強制忽略客戶端編碼聲明,以服務端為準
注意: 修改後必須重啟 MySQL 服務。舊版文檔建議 gbk,現代應用統一使用 utf8mb4(支持 Emoji 與生僻字)。
-- 查看數據庫編碼
SHOW CREATE DATABASE db_name;
-- 查看表編碼
SHOW CREATE TABLE tbl_name;
-- 修改數據庫默認編碼(不影響已有表)
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
-- 修改表及所有列編碼(會重建表,大表慎用)
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
SELECT HEX(col) FROM tbl 檢查十六進制是否為 UTF-8 編碼(如「中」= E4B8AD)。