MySQL 5.5/5.6/5.7 預設 latin1,需修改 /etc/mysql/my.cnf (或 /etc/my.cnf) 並重啟服務。以下為標準步驟,適用 Ubuntu/Debian/CentOS (路徑微調)。
service mysql stop
# 或 systemctl stop mysqld
vim /etc/mysql/my.cnf
# 在 [mysqld] 區段下新增兩行
character_set_server = utf8mb4
init_connect = 'SET NAMES utf8mb4'
# 建議同時在 [client] 和 [mysql] 區段加入
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
service mysql start
# 或 systemctl start mysqld
mysql -uroot -p -e "SHOW VARIABLES LIKE 'character%';"
# 預期輸出關鍵變數均為 utf8mb4
# character_set_client | utf8mb4
# character_set_connection | utf8mb4
# character_set_database | utf8mb4
# character_set_results | utf8mb4
# character_set_server | utf8mb4
# character_set_system | utf8mb4
配置修改僅影響新建物件,現有資料需手動轉換:
-- 資料庫層級
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(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
character_set_server:伺服器層預設字元集,新建資料庫/表繼承此值。init_connect:非 SUPER 權限用戶連線時自動執行,確保會話層字元集一致。collation_server:建議同步設為 utf8mb4_unicode_ci (Unicode 標準排序) 或 utf8mb4_0900_ai_ci (8.0 新排序規則)。| 現象 | 原因 | 解決 |
|---|---|---|
| 修改後仍顯示 latin1 | 配置文件區段錯誤/未重啟/讀取了其它 my.cnf | mysql --help | grep my.cnf 確認讀取順序;ps aux | grep mysqld 確認啟動參數 |
| 啟動失敗 Unknown variable | 參數名拼寫錯誤/版本不支援 | 檢查拼寫;5.7 支援 utf8mb4,5.5 需確認版本 ≥ 5.5.3 |
| 應用亂碼 | 應用連線未指定 charset | JDBC 加 characterEncoding=utf8mb4;PHP PDO 加 charset=utf8mb4 |