Debian/Ubuntu 系統下 MySQL 中文亂碼高發,核心原因是 5.5 版本前後配置參數名稱變更(default-character-set → character-set-server)。本文提供按版本區分的精確配置模板,經 Debian 7.0 / MySQL 5.5+ 實測驗證。
mysql> STATUS;
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
默認全鏈路 latin1,寫入中文報錯或存為亂碼。
# /etc/mysql/my.cnf
[client]
default-character-set = utf8
[mysqld]
default-character-set = utf8
# 若啟動報錯,改為:
# character_set_server = utf8
# /etc/mysql/my.cnf
[client]
default-character-set = utf8mb4
[mysqld]
default-storage-engine = InnoDB
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci # 8.0 可用 utf8mb4_0900_ai_ci
⚠️ **關鍵差異**:[mysqld] 區段**不再支持** default-character-set,必須用 character-set-server + collation-server。
systemctl restart mysql(或 service mysql restart)mysql -uroot -p -e "SHOW VARIABLES LIKE 'character_set_%';"character_set_server、character_set_database、character_set_client、character_set_connection、character_set_results 均為 utf8mb4INSERT INTO t(c) VALUES ('測試😀'); SELECT HEX(c) FROM t; 應見 F0 9F 98 80| 誤區 | 後果 | 正確做法 |
|---|---|---|
在 5.5+ 用 default-character-set=utf8 | 啟動報錯 unknown variable 或配置不生效 | 改用 character-set-server |
只改 [client] 不改 [mysqld] | 服務端仍用 latin1,存入數據仍亂碼 | 雙區段同步設置 |
用 utf8 而非 utf8mb4 | 無法存 Emoji/生僻字(utf8 實為 utf8mb3) | 全鏈路 utf8mb4 |
| 修改配置後未重啟 | 不生效 | 必須重啟 mysqld |
$pdo = new PDO("mysql:host=127.0.0.1;dbname=test;charset=utf8mb4", $user, $pass);
// 或 mysqli
$mysqli->set_charset('utf8mb4');
掌握版本參數差異,按模板修改 my.cnf 並重啟,Debian 系統 MySQL 中文亂碼可一次性徹底解決。