導入包含中文的 SQL 文件時,若目標數據庫/表字符集為 UTF-8 但導入會話字符集未正確設置,會導致中文亂碼。根因是客戶端與服務端字符集協商不一致。
CHARSET=utf8mb4 / COLLATE=utf8mb4_unicode_cimysql -uroot -p db_name < backup.sql??? 或亂碼字符原因:默認連接字符集可能為 latin1,服務端按 latin1 解碼客戶端發送的字節流,再按 utf8mb4 存儲,雙重編碼錯位導致亂碼。
在 SQL 文件第一行添加:
/*!40101 SET NAMES utf8mb4 */;
或命令行指定:
mysql --default-character-set=utf8mb4 -uroot -p db_name < backup.sql
/*!40101 ... */:版本註釋語法,MySQL 4.1.1+ 執行,舊版本忽略,兼容性極佳SET NAMES utf8mb4 等價於三條語句:
SET character_set_client = utf8mb4SET character_set_connection = utf8mb4SET character_set_results = utf8mb4| 層級 | 檢查項 | 推薦值 |
|---|---|---|
| 服務端 | character_set_server | utf8mb4 |
| 服務端 | collation_server | utf8mb4_unicode_ci |
| 數據庫 | DEFAULT CHARACTER SET | utf8mb4 |
| 表 | DEFAULT CHARSET | utf8mb4 |
| 列 | CHARACTER SET | utf8mb4 |
| 連接 | SET NAMES / --default-character-set | utf8mb4 |
| 應用 | JDBC/PDO/PHP mysqli 連接參數 | charset=utf8mb4 |
utf8 而非 utf8mb4:utf8 僅支援 BMP 平面(3 字節),無法存儲 Emoji 等補充字符ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 才會真正轉換已有數據SET NAMES utf8mb4一行 SET NAMES utf8mb4,解決 90% 導入亂碼問題。建立全鏈路 UTF-8MB4 規範,從根源消除編碼困擾。