萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

徹底解決 MySQL 中文亂碼:統一字符集為 utf8mb4 完整配置

問題根源

MySQL 預設字符集 latin1 (單位元組),無法儲存中文。若客戶端、連線、伺服器、資料庫、資料表、欄位字符集不一致,會發生多次隱式轉換導致亂碼。

一鍵檢查現狀

SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';

關鍵變數:

  • character_set_server:伺服器預設
  • character_set_database:當前資料庫預設
  • character_set_client/connection/results:客戶端/連線/結果集編碼
  • collation_server/database/connection:校對規則

完整配置步驟 (Linux/Windows 通用)

1. 修改伺服器設定檔

Linux:/etc/my.cnf 或 /etc/mysql/my.cnf
Windows:my.ini (安裝目錄或 C:\ProgramData\MySQL\MySQL Server X.Y\)

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
# 以下可選,強制所有連線使用 utf8mb4
# skip-character-set-client-handshake

2. 重啟服務

# Linux
systemctl restart mysqld

# Windows (管理員 CMD)
net stop MySQL
net start MySQL

3. 驗證生效

SHOW VARIABLES LIKE 'character%';
-- 應全顯示 utf8mb4 (filesystem 除外,固定 binary)

現有資料庫/資料表/欄位轉換

配置檔只影響新建物件,既有資料需手動轉換:

-- 資料庫層級
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

-- 資料表層級 (含所有欄位)
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 單一欄位 (若不想轉換全表)
ALTER TABLE tbl_name MODIFY col_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

為什麼選 utf8mb4 而非 utf8?

特性utf8 (MySQL 稱 utf8mb3)utf8mb4
最大字元長度3 位元組4 位元組
支援 Emoji/生僻字❌✅
索引鍵長度限制 (InnoDB)767 位元組 (255 字元)767 位元組 (191 字元)
啟用 innodb_large_prefix需手動開啟5.7.7+ 預設開啟,支援 3072 位元組

建議:MySQL 5.5.3+ 全面支援 utf8mb4,新專案直接使用;舊專案升級需注意 VARCHAR(255) 索引需縮為 191 或開啟 innodb_large_prefix。

應用層配合

  • JDBC URL:jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useSSL=false
  • PHP PDO:new PDO("mysql:host=...;dbname=...;charset=utf8mb4", ...)
  • Python:charset='utf8mb4' 在連線參數中指定
  • 框架設定:Laravel config/database.php → 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci'

常見坑點

  1. SET NAMES utf8 只影響當前會話,重連失效 → 必須配置 init_connect 或驅動層指定
  2. skip-character-set-client-handshake 強制忽略客戶端請求編碼,可能導致舊應用亂碼 → 謹慎啟用
  3. 匯出/匯入 SQL 檔需確保檔案編碼為 UTF-8 (BOM)
  4. 檢查 max_allowed_packet 足夠大,避免長文本截斷
copyright © 萬盛學電腦網 all rights reserved