JSP 頁面表單提交中文 → Servlet/DAO 入庫 → 數據庫查看變 ????,但直接在數據庫客戶端插入中文正常。
數據流向:瀏覽器 → Tomcat → JDBC → MySQL,每一環節的編碼必須一致。任一環節不匹配即產生亂碼。
<%@ page contentType="text/html;charset=UTF-8" %>,HTML meta 標簽 <meta charset="UTF-8">。server.xml 的 <Connector port="8080" URIEncoding="UTF-8" />(GET 參數需此項,POST 需配合 Filter)。jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC。SHOW VARIABLES LIKE 'character_set_%';
-- 確保 character_set_database, character_set_server, character_set_connection 均為 utf8 或 utf8mb4
建表時顯式指定:CREATE TABLE t (...) DEFAULT CHARSET=utf8mb4;(utf8mb4 支持 Emoji)。
@WebFilter("/*")
public class EncodingFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
chain.doFilter(req, resp);
}
}
或在 web.xml 配置 Spring 的 CharacterEncodingFilter。
new String(param.getBytes("ISO-8859-1"), "UTF-8") 測試(Tomcat 8+ 默認 UTF-8 通常無需此轉換)。SELECT HEX(col) FROM t 檢查存儲的十六進制編碼。