將 MySQL 從 4.0 升級至 4.1.11 後,原本正常運行的 Mantis 系統出現全站亂碼。經排查,MySQL 4.1+ 引入字符集支持,預設為 UTF-8,而舊數據實為 GBK 編碼,導致讀取錯位。
| 維度 | UTF-8 | GBK |
|---|---|---|
| 多語言支持 | 完美支援中日韓等所有語言 | 僅支援中文簡體/繁體,日韓文易亂碼 |
| 存儲空間 | 漢字佔 3 位元組 | 漢字佔 2 位元組,節省 33% |
| 遷移成本 | 需轉碼,工具鏈成熟 | 舊系統多為 GBK,無需轉碼 |
| 外部交換 | JSON/API 標準編碼,免轉碼 | 需額外轉碼層 |
無論數據庫內部編碼為何,PHP 執行查詢前必須聲明連接字符集:
$mysqli->set_charset('utf8mb4'); // 推薦 utf8mb4 支援 Emoji
// 或舊版 mysql 扩展
mysql_query("SET NAMES utf8");
mysqldump --default-character-set=latin1 導出 → 建立 utf8mb4 庫 → 導入 → 檢查無誤後切換應用連接字符集。mbstring 處理多字節字符串,避免手寫截取函數。