在 Java 應用程式開發中,連接 MySQL 資料庫時遇到中文亂碼是常見的棘手問題。這類問題通常源於字符集配置不一致,涉及資料庫伺服器、連接層、客戶端工具等多個環節。本文將系統梳理解決方案,從配置檔修改到程式碼層面的處理,助你徹底根治亂碼困擾。
首先在 MySQL 客戶端執行以下指令,檢視當前字符集配置:
SHOW VARIABLES LIKE 'character%';
若輸出結果中 character_set_client、character_set_connection、character_set_results 等關鍵變數非 utf8(或 utf8mb4),則會導致中文讀寫異常。Windows 環境下可修改 my.ini,Linux 下對應 my.cnf。
編輯 my.cnf(或 my.ini),在三個區段分別加入字符集設定,注意區段名稱不可寫錯:
[client] port = 3306 socket = /var/lib/mysql/mysql.sock default-character-set = utf8
[mysqld] port = 3306 socket = /var/lib/mysql/mysql.sock character-set-server = utf8
[mysql] no-auto-rehash default-character-set = utf8
關鍵提醒: [mysqld](伺服器進程)與 [mysql](命令列客戶端)是兩個不同區段,網路上常見教程混淆兩者,導致配置不生效。修改完成後執行 service mysql restart 重啟服務。
重啟後再次執行 SHOW VARIABLES LIKE 'character%';,確認所有 character_set_* 變數均顯示 utf8,即表示伺服器層面已正確配置。
即使伺服器配置正確,部分 JDBC 驅動版本或連接池仍可能忽略伺服器端字符集。最穩妥的做法是在建立連接後、執行查詢前,主動發送指令:
SET NAMES 'utf8';
等同於以下三條指令的組合:
SET character_set_client = utf8; SET character_set_results = utf8; SET character_set_connection = utf8;
Connection conn = DriverManager.getConnection(url, user, pass);
try (Statement stmt = conn.createStatement()) {
stmt.execute("SET NAMES 'utf8'"); // 必須在查詢前執行
// 後續查詢操作...
}
在 JDBC URL 中顯式指定字符編碼,避免手動執行 SQL:
jdbc:mysql://host:3306/dbname?useUnicode=true&characterEncoding=utf8&autoReconnect=true
utf8mb4 完整支援 Emoji 及生僻字,配置時將上述 utf8 替換為 utf8mb4 即可。CREATE TABLE 及 ALTER TABLE 指定 CHARSET=utf8mb4,欄位層級亦可單獨設定。遵循「伺服器配置為主,連接層兜底」原則,配合統一編碼環境,即可徹底解決 Java 連接 MySQL 中文亂碼問題。