| 層面 | 變數 | 作用 | 常見值 |
|---|---|---|---|
| Server | character_set_server | 建庫建表預設編碼 | latin1 / utf8 / utf8mb4 |
| Database/Table/Column | CHARSET | 實際儲存編碼 | utf8 / gbk / utf8mb4 |
| Connection | character_set_client/connection/results | 客戶端↔Server 通訊編碼 | utf8 / gbk / latin1 |
鐵律:Client = Connection = Results = Table Column,四者完全一致,零亂碼。
# /etc/my.cnf / /etc/mysql/my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
systemctl restart mysqld
-- 庫
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 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useSSL=falsenew PDO("mysql:host=...;dbname=...;charset=utf8mb4", ...)charset='utf8mb4' 參數mysql --default-character-set=utf8mb4SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';
-- 期望全部為 utf8mb4 / utf8mb4_unicode_ci
mysqldump --default-character-set=gbk db > backup.sqlmysql --default-character-set=utf8mb4 db < backup.sql| 現象 | 原因 | 解決 |
|---|---|---|
| 命令列正常、Web 亂碼 | 應用連線未指定 charset | 修正連接池/DSN 參數 |
| Emoji 存成 ???? | 表/欄位仍為 utf8 (3 字節) | CONVERT TO utf8mb4 |
| 匯出 CSV 亂碼 | Excel 預設 ANSI/GBK | 匯出 UTF-8 BOM 或用工具轉碼 |
| 排序錯誤 | Collation 不同 | 統一 utf8mb4_unicode_ci |
MySQL 中文亂碼 99% 來自三層編碼不一致。Server/Table/Connection 全鏈路 utf8mb4 + 統一 Collation,一次配置、永久免疫。新專案開工第一件事:SET NAMES utf8mb4 寫入基線規範。