首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

JDBC 連接 MySQL 中文亂碼(問號)根因分析與完整解決方案

     編輯:MySQL 資料庫相關知識

問題現象

Java 應用通過 JDBC 向 MySQL 寫入中文資料後,查詢結果顯示為「????」或亂碼,經典的字符編碼不一致問題。

排查步驟與解決方案

1. 檢查 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 服務生效。

2. 確認 IDE / 編譯環境編碼

Eclipse / IntelliJ IDEA 專案編碼、編譯輸出編碼、Tomcat URI 編碼均需統一設為 UTF-8。

3. 檢查資料表實際字符集

SHOW CREATE TABLE 表名;

若表字符集非 UTF-8,建議重建表而非 ALTER TABLE 轉換(避免資料損壞)。

完整 JDBC 連接範例(含編碼參數)

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-8
  • autoReconnect=true:自動重連(生產環境建議用連接池管理)
  • useSSL=false:本地開發關閉 SSL 減少握手延遲

最佳實踐建議

  1. 資料庫、表、欄位、連接字符集全鏈路統一為 utf8mb4(支援 Emoji)
  2. 使用 Druid / HikariCP 連接池替代手動管理連接
  3. JDBC URL 統一配置在外部配置檔,避免硬編碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved