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

MySQL 中文亂碼問題徹底解決:字符集配置、連線協議、應用層最佳實踐

     編輯:MySQL 資料庫相關知識

中文亂碼是 MySQL 使用者最常遇到的坑,本質是「編碼不一致」:存儲編碼、連線編碼、應用編碼、終端編碼任一環節不匹配即會產生亂碼。本文系統梳理字符集架構、配置檔修改、連線建立時指定編碼、排查步驟與生產環境標準化清單。

一、MySQL 字符集四層架構

層級變數作用查看命令
服務器character_set_server建庫建表預設字符集SHOW VARIABLES LIKE 'character_set_server';
資料庫character_set_database庫級預設(建表時繼承)SHOW CREATE DATABASE db;
資料表character_set_table表級預設(建欄位時繼承)SHOW CREATE TABLE t;
欄位character_set_column實際存儲編碼SHOW FULL COLUMNS FROM t;
連線character_set_client/connection/results客戶端發送/服務端處理/結果返回編碼SHOW VARIABLES LIKE 'character_set_%';

二、標準化配置(推薦 utf8mb4)

# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci  # 或 utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'     # 連線建立時自動執行(超級用戶除外)

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4
⚠️ utf8 是 utf8mb3 別名,**不支援 Emoji/生僻字**(僅 3 字節),**必須用 utf8mb4**。

三、現有庫表轉換腳本

-- 1. 庫級轉換(僅影響後續建表)
ALTER DATABASE mydb CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

-- 2. 表級轉換(含所有字符欄位、索引重建,大表慎用 pt-osc)
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

-- 3. 僅修改表預設字符集(不轉換現有欄位)
ALTER TABLE mytable DEFAULT CHARACTER SET utf8mb4;

四、應用層連線指定編碼(關鍵)

語言/驅動正確做法
PHP PDOnew PDO("mysql:host=...;dbname=...;charset=utf8mb4", $user, $pass) DSN 含 charset
PHP mysqlimysqli_set_charset($link, 'utf8mb4') 連線後立即執行
Java JDBCURL 參數 ?characterEncoding=utf8mb4&connectionCollation=utf8mb4_general_ci 或 SET NAMES utf8mb4
Python PyMySQLcharset='utf8mb4' 參數
Go sqlxDSN charset=utf8mb4 或 SET NAMES utf8mb4

五、排查步驟:亂碼發生時怎麼查?

  1. SHOW VARIABLES LIKE 'character_set_%'; 確認連線三變數均為 utf8mb4。
  2. SELECT HEX(col), col FROM t WHERE id=1; 查看實際存儲字節,對照 UTF-8 編碼表判斷是否正確。
  3. 檢查應用日誌:SQL 執行前參數是否已亂碼(終端/IDE 編碼問題)。
  4. 檢查備份文件:mysqldump --default-character-set=utf8mb4 導出是否正確。

六、生產環境標準化清單

  • ✅ 服務器 character_set_server=utf8mb4
  • ✅ 所有庫/表/欄位 utf8mb4(含 COLLATE)
  • ✅ 應用連線 DSN/參數顯式指定 charset=utf8mb4
  • ✅ 連線池初始化執行 SET NAMES utf8mb4
  • ✅ mysqldump/mysqlbinlog/pt-* 工具均加 --default-character-set=utf8mb4
  • ✅ 終端/IDE/日誌系統編碼統一 UTF-8

亂碼不可怕,可怕的是「以為好了其實沒好」。建立全鏈路 utf8mb4 標準,並納入部署檢查清單,從根源杜絕編碼地獄。

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