MySQL 字元集設定分為三個生效層級,理解其優先順序與作用範圍,是解決亂碼、支援 Emoji、實現多語言儲存的關鍵。本文詳細說明三種設定方式、utf8mb4 遷移步驟與驗證方法。
| 層級 | 生效範圍 | 持久性 | 優先順序 | 適用場景 |
|---|---|---|---|---|
| 會話級 (SET) | 當前連線 | 連線斷開失效 | 最高 (覆蓋全域) | 測試、特定任務、臨時相容 |
| 全域級 (my.cnf) | 所有新連線 | 重啟服務永久生效 | 中 | 生產環境標準配置 |
| 應用層 (連線參數) | 該應用連線 | 連線存活期間 | 最高 (覆蓋會話/全域) | 應用程式碼控制,最可靠 |
-- 單獨設定各變數
SET [GLOBAL] character_set_client = utf8mb4;
SET [GLOBAL] character_set_connection = utf8mb4;
SET [GLOBAL] character_set_database = utf8mb4;
SET [GLOBAL] character_set_results = utf8mb4;
SET [GLOBAL] character_set_server = utf8mb4;
-- 一鍵設定 (推薦,等同以上 5 項)
SET NAMES 'utf8mb4';
-- 等效於:
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;
注意:不加 GLOBAL 僅影響當前會話;加上則影響後續新連線 (需 SUPER 權限)。
編輯 my.cnf (Linux) 或 my.ini (Windows):
[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 (需 5.7+)
# character-set-client-handshake = FALSE
修改後必須重啟 MySQL 服務** 才生效。
在連線字串/建構子中显式指定,不依賴伺服器配置:
jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useUnicode=truenew PDO("mysql:host=...;dbname=...;charset=utf8mb4", ...)charset='utf8mb4'charset: 'utf8mb4'dsn += "?charset=utf8mb4"Charset=utf8mb4| 特性 | utf8 (MySQL 別名 utf8mb3) | utf8mb4 |
|---|---|---|
| 最大字節長度 | 3 字節 | 4 字節 |
| 支援字元範圍 | BMP 平面 (基本多文種平面) | 完整 Unicode (含增補平面) |
| Emoji 支援 | ❌ 存入變 ???? | ✅ 完美支援 |
| 生僻漢字 | ❌ 部分無法儲存 | ✅ 全支援 |
| 索引長度限制 | 767 字節 (舊版) | 767 字節 (5.7.7- / 3072 字節 5.7.7+) |
mysqldump --single-transaction --routines --triggers --events dbname > backup.sqlcharacter-set-server = utf8mb4,重啟服務ALTER DATABASE dbname CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;SHOW FULL COLUMNS FROM tbl_name 確認 Collation 已更新charset=utf8mb4utf8mb4_unicode_ci:UCA 標準排序,準確支援多語言,**推薦預設**utf8mb4_general_ci:舊版簡化排序,速度略快但準確度較低utf8mb4_zh_ci / _0900_ai_ci:中文拼音/筆畫排序 (8.0+)utf8mb4_bin:二進位比較,區分大小寫、重音、寬窄SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';
SELECT @@character_set_database, @@collation_database;
SHOW CREATE DATABASE dbname;
SHOW CREATE TABLE tblname;
MySQL 字元集配置鐵律:
1. **全鏈路 utf8mb4** (Server/Database/Table/Column/Connection)
2. **應用層显式指定 charset=utf8mb4** (最高優先級、最可靠)
3. **新專案預設 utf8mb4**,舊專案計畫遷移
4. 定期驗證 SHOW VARIABLES LIKE 'character_set_%' 確保配置生效