首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 中文亂碼徹底解決方案:從 my.cnf 到連接參數的全鏈路配置

     編輯:MySQL 綜合教學

MySQL 中文亂碼徹底解決方案:從 my.cnf 到連接參數的全鏈路配置

問題現象

插入中文顯示為「???」或亂碼,SHOW VARIABLES LIKE '%char%' 顯示 character_set_client/connection/results = latin1/gbk,與數據不匹配。

根因分析:字符集傳輸鏈路

MySQL 字符集流向:

客戶端編碼 (client) 
    → 連接層轉換 (connection) 
    → 服務端內部處理 (server/database/table/column) 
    → 結果集編碼 (results)

任一環節不一致,即產生亂碼。

永久解決:修改 my.cnf(或 my.ini)

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect = 'SET NAMES utf8mb4'  -- 針對非超級用戶自動執行

關鍵點:

  • 推薦 utf8mb4(支援 Emoji、完整 Unicode),而非舊版 utf8(僅 3 字節)。
  • [client] 影響 mysql、mysqldump 等客戶端工具。
  • [mysqld] 決定服務端默認字符集與排序規則。
  • 修改後 重啟 MySQL 服務 生效。

臨時方案(僅當前會話生效)

SET NAMES utf8mb4;  -- 等同於設定 client/connection/results 三者
-- 或
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;

驗證配置生效

SHOW VARIABLES LIKE '%char%';
-- 期望輸出:
-- character_set_client     | utf8mb4
-- character_set_connection | utf8mb4
-- character_set_database   | utf8mb4
-- character_set_results    | utf8mb4
-- character_set_server     | utf8mb4
-- character_set_system     | utf8mb4

應用層連接參數(以 Java/JDBC 為例)

jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8mb4&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
  • useUnicode=true + characterEncoding=utf8mb4 必須同時設置。
  • 連接池(HikariCP/Druid)同樣需在 URL 中帶上參數。

避坑清單

  1. 表/列級字符集未顯式指定 → 繼承庫默認,建議建表時顯式 CHARSET=utf8mb4。
  2. 舊數據已為 latin1 存儲 → 需 ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 重建表轉碼。
  3. Windows 下 my.ini 路徑易混淆 → 用 mysqld --help --verbose | findstr my.ini 確認讀取順序。

一次配置正確,永別亂碼煩惱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved