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

MySQL 中文亂碼徹底解決:my.cnf 配置、字元集驗證、JDBC 連線參數、UTF8MB4 遷移指南

     編輯:MySQL 資料庫相關知識

問題根源:字元集不一致

伺服器、資料庫、資料表、連線、客戶端五層字元集任一不匹配即產生亂碼。

五步驟標準配置流程

1. 伺服器配置檔 (my.cnf / my.ini)


[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# init_connect = 'SET NAMES utf8mb4'  # 避免影響 root 連線

⚠️ 不再建議使用 GBK:UTF8MB4 完整支援 Emoji、生僻字、多語言,為現代標準。

2. 重啟服務並建立資料庫


systemctl restart mysqld
mysql -u root -p
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3. 驗證四層字元集一致性


mysql -u root -p
USE mydb;
STATUS;
# 關鍵輸出必須全為 utf8mb4:
# Server characterset: utf8mb4
# Db characterset: utf8mb4
# Client characterset: utf8mb4
# Conn. characterset: utf8mb4

4. 應用連線層配置 (JDBC/PDO/mysqli)


# JDBC (MySQL Connector/J 5.1+ 自動偵測,可省略)
jdbc:mysql://host:3306/mydb?useUnicode=true&characterEncoding=utf8mb4&autoReconnect=true

# PHP PDO
$pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8mb4", $user, $pass);

# PHP mysqli
mysqli_set_charset($link, 'utf8mb4');
# 或連線時
$mysqli = new mysqli('localhost', 'user', 'pass', 'mydb', 3306);
$mysqli->set_charset('utf8mb4');

5. 程式碼層面顯式設定 (針對舊版驅動/特殊環境)


# PHP mysqli (Linux 環境常需)
$db->query("SET NAMES utf8mb4");
# 或
$db->query("SET CHARACTER SET utf8mb4");

字元集驗證完整命令


# 伺服器層級
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

# 資料庫層級
SHOW CREATE DATABASE mydb;

# 資料表層級
SHOW CREATE TABLE mytable;

# 欄位層級
SHOW FULL COLUMNS FROM mytable;

UTF8 vs UTF8MB4 關鍵差異

特性utf8 (MySQL utf8mb3)utf8mb4
最大字元長度3 位元組4 位元組
Emoji 支援❌ 無法儲存✅ 完整支援
生僻字 (CJK Extension)部分不支援✅ 完整支援
索引長度限制767 bytes (InnoDB)767 bytes (需 innodb_large_prefix=ON 3072 bytes)
MySQL 版本所有版本5.5.3+

遷移 GBK/UTF8 → UTF8MB4 完整流程

  1. 完整備份:mysqldump --default-character-set=gbk --all-databases > backup.sql
  2. 修正備份檔:
    
    sed -i 's/CHARSET=gbk/CHARSET=utf8mb4/g' backup.sql
    sed -i 's/CHARSET=utf8/CHARSET=utf8mb4/g' backup.sql
    sed -i 's/COLLATE=gbk_chinese_ci/COLLATE=utf8mb4_unicode_ci/g' backup.sql
    sed -i 's/COLLATE=utf8_general_ci/COLLATE=utf8mb4_unicode_ci/g' backup.sql
    
  3. 調整 my.cnf 設定 character-set-server=utf8mb4、innodb_large_prefix=ON、innodb_file_format=Barracuda、innodb_file_per_table=ON
  4. 重啟服務、建立新 UTF8MB4 資料庫
  5. 匯入備份:mysql --default-character-set=utf8mb4 < backup.sql
  6. 驗證應用:全鏈路測試 (含 Emoji、生僻字)

常見誤區

  • ❌ 僅修改資料庫/表字元集,未修改 my.cnf 伺服器預設
  • ❌ 連線字串未指定 charset=utf8mb4
  • ❌ 使用 SET NAMES utf8 而非 utf8mb4
  • ❌ 索引長度錯誤:遷移後未開啟 innodb_large_prefix 導致 Specified key was too long
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved