Java 應用通過 JDBC 向 MySQL 寫入中文資料後,查詢結果顯示為「????」或亂碼,經典的字符編碼不一致問題。
mysql> SHOW VARIABLES LIKE '%char%';
若非 utf8(或 utf8mb4`),需修改 my.ini(Windows)或 my.cnf(Linux)在對應段落添加:
[client]
default-character-set=utf8
[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
[mysql]
default-character-set=utf8
修改後必須重啟 MySQL 服務生效。
Eclipse / IntelliJ IDEA 專案編碼、編譯輸出編碼、Tomcat URI 編碼均需統一設為 UTF-8。
SHOW CREATE TABLE 表名;
若表字符集非 UTF-8,建議重建表而非 ALTER TABLE 轉換(避免資料損壞)。
import java.sql.*;
public class MySQLConnection {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
// 關鍵:useUnicode=true&characterEncoding=utf8
String url = "jdbc:mysql://localhost:3306/test?" +
"user=root&password=yourpass" +
"&useUnicode=true&characterEncoding=utf8" +
"&autoReconnect=true&useSSL=false";
try {
Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 8.0+ 驅動類
conn = DriverManager.getConnection(url);
stmt = conn.createStatement();
// 測試中文寫入
stmt.executeUpdate("INSERT INTO dept(deptname) VALUES('測試部門')");
// 查詢驗證
rs = stmt.executeQuery("SELECT * FROM dept");
while (rs.next()) {
System.out.println(rs.getInt("deptno") + " " + rs.getString("deptname"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 標準關閉流程
closeQuietly(rs);
closeQuietly(stmt);
closeQuietly(conn);
}
}
private static void closeQuietly(AutoCloseable c) {
if (c != null) try { c.close(); } catch (Exception ignore) {}
}
}
useUnicode=true:啟用 Unicode 字符集characterEncoding=utf8:指定傳輸編碼為 UTF-8autoReconnect=true:自動重連(生產環境建議用連接池管理)useSSL=false:本地開發關閉 SSL 減少握手延遲Druid / HikariCP 連接池替代手動管理連接