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

MySQL 中文亂碼終極解決方案:從服務端到應用層全鏈路配置

     編輯:MySQL 資料庫相關知識

亂碼根因:字符集不一致

MySQL 涉及四層字符集設置,任意一層不匹配即產生亂碼:

  1. 服務端:character_set_server
  2. 數據庫:character_set_database
  3. 表/列:character_set_client / column_charset
  4. 連接層:character_set_connection、character_set_results

服務端配置:修改 my.cnf/my.ini

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

關鍵點:

  • 必須用 utf8mb4 而非 utf8(utf8 只是 utf8mb3,不支持 Emoji/生僻字)
  • 修改後 重啟服務 生效,僅影響新建庫/表
  • Windows 下 my.ini 通常在安裝目錄或 C:\ProgramData\MySQL\MySQL Server X.Y\

庫/表級字符集管理

創建時指定(推薦)

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

存量庫/表轉換

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

-- 表級轉換(含數據重寫,大表慎用)
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 僅修改表默認字符集(不轉換現有列)
ALTER TABLE users DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 單列轉換
ALTER TABLE users MODIFY name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

連接層字符集:SET NAMES 核心機制

SET NAMES utf8mb4 等價於同時設置:

SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;
  • client:客戶端發送 SQL 的編碼
  • connection:服務端解析 SQL 時的編碼
  • results:結果集返回給客戶端的編碼

最佳實踐:連接建立後立即執行 SET NAMES utf8mb4,或在連接串指定:
JDBC: ?useUnicode=true&characterEncoding=utf8mb4
PHP PDO: charset=utf8mb4
Python: charset='utf8mb4'

數據導入導出字符集對齊

數據文件編碼設置導入命令
UTF-8SET NAMES utf8mb4LOAD DATA INFILE 'utf8.txt' INTO TABLE t CHARACTER SET utf8mb4;
GBK/ANSISET NAMES gbkLOAD DATA INFILE 'gbk.txt' INTO TABLE t CHARACTER SET gbk;

鐵律:文件編碼、SET NAMES、目標表字符集三者必須完全一致。Windows CMD 不支持 UTF-8 顯示,導入驗證請用工具查看。

應用層配置清單

  • HTML 頁面:<meta charset="utf-8">(瀏覽器識別為 utf-8 即涵蓋 utf8mb4)
  • Java/JDBC:useUnicode=true&characterEncoding=utf8mb4&zeroDateTimeBehavior=convertToNull
  • PHP mysqli:mysqli_set_charset($link, 'utf8mb4')
  • Python PyMySQL:charset='utf8mb4' 參數
  • Node.js mysql2:charset: 'utf8mb4'

排查檢查清單

-- 1. 查看當前會話字符集
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';

-- 2. 查看庫/表/列實際字符集
SHOW CREATE DATABASE mydb;
SHOW CREATE TABLE users;
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME 
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='mydb' AND TABLE_NAME='users';

-- 3. 驗證寫入讀取
INSERT INTO users(name) VALUES('測試😀');
SELECT name, HEX(name) FROM users WHERE name LIKE '%測試%';

若 HEX 顯示 E6B58BE8AF95F09F9880 (UTF-8 編碼) 則全鏈路正確。

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