JSP 專案中文亂碼是初學者常見的痛點。亂碼成因眾多,涉及伺服器、資料庫、資料表、欄位、JSP 頁面、瀏覽器提交等多個環節。本文系統整理亂碼成因,並提供 MySQL 編碼修改的實用 SQL 指令。
CREATE TABLE 時的 CHARSET 參數CHARACTER SETcharacterEncoding 參數request.setCharacterEncoding()建議:新專案直接採用 UTF-8;舊專案若無法全面轉換,可考慮 GBK 相容簡繁混雜情況。
ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
僅影響後續新建的資料表,既有資料表不受影響。
ALTER TABLE `category` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
同樣僅影響後續新增的欄位。
ALTER TABLE `test` CHANGE `dd` `dd` VARCHAR(45)
CHARACTER SET utf8 COLLATE utf8_bin NOT NULL;
注意:需完整重述欄位定義(型別、長度、NULL/NOT NULL 等),否則會導致欄位屬性遺失。
ALTER TABLE `table_name` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
// MySQL 5.1+ 驅動
String url = "jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8";
// 完整範例
private String url = "jdbc:mysql://localhost/" + DB_NAME
+ "?user=" + LOGIN_NAME
+ "&password=" + LOGIN_PASS
+ "&useUnicode=true&characterEncoding=UTF-8";
<%
request.setCharacterEncoding("UTF-8");
// 然後才能 request.getParameter(...)
%>
「按照以上方法修改以後只能保證你新插入的數據不會亂碼。如果你用戶已提交的數據是 BIG5,你卻想通過以上方法改為可以在 GB2312 的網頁正確顯示是不可能的,這種文字內碼的變換只能通過另寫程序來解決。」
歷史資料修復需撰寫轉碼程式:讀出 → 以正確編碼解碼 → 以目標編碼編碼 → 寫回。
contentType 與 pageEncoding 設定<meta charset="UTF-8"> 存在request.setCharacterEncoding("UTF-8") 在最早執行useUnicode=true&characterEncoding=UTF-8<form accept-charset="UTF-8">中文亂碼本質是「編碼不匹配」。解決策略是全鏈路統一編碼:資料庫 → 連線 → JSP → 瀏覽器 全部採用 UTF-8。新專案一開始就設定正確,可避免 99% 的亂碼問題。