MySQL 4.1 引入完整字元集支援,使舊版資料(通常為 GB2312/GBK 編碼)遷移至 UTF-8 成為常見需求。轉換過程若處理不當,易導致亂碼、匯入失敗或效能問題。本文整理實戰經驗,提供標準化操作流程。
使用 mysqldump 匯出結構與資料:
mysqldump -u root -p --add-drop-table --extended-insert database_name > backup.sql
--add-drop-table:匯入時自動刪除舊表,簡化操作。--extended-insert:多行合併 INSERT,避免單一 SQL 過大導致錯誤。iconv 將 backup.sql 從 GB2312 轉為 UTF-8 無 BOM 格式。iconv -f gb2312 -t utf-8 backup.sql > backup_utf8.sqlgbk_bin → utf8_general_cigbk → utf8SET NAMES utf8;關鍵提醒:UTF-8 檔案不可包含 BOM,否則 mysql 客戶端會報語法錯誤(ERROR 1064)。
mysql -u root -p -e "CREATE DATABASE new_db CHARACTER SET utf8 COLLATE utf8_general_ci;"
mysql -u root -p new_db < backup_utf8.sql
若匯入報 Got a packet bigger than 'max_allowed_packet',修改 my.ini(Windows)或 my.cnf(Linux)[mysqld] 區段:
max_allowed_packet = 16M
重啟服務生效。
PHP 範例:
mysql_query("SET NAMES 'utf8'");
iconv 批次轉換 PHP/HTML 模板檔:iconv -f gb2312 -t utf-8 input.php > output.php<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />| 問題 | 原因 | 解決 |
|---|---|---|
匯入報錯 ERROR 1064 損壞字元 | SQL 檔案含 BOM | 另存為 UTF-8 無 BOM |
| 中文顯示亂碼 | 連線未設 SET NAMES utf8 | 應用程式連線後立即執行 |
| 大量資料匯入失敗 | max_allowed_packet 過小 | 調大至 16M-64M 並重啟 |
編碼遷移核心在於「備份→轉檔→修正 SQL→匯入→驗證→應用層配合」六步驟。嚴格遵循無 BOM 原則、統一字元集宣告、預留足夠封包大小,即可平滑完成 GB2312 到 UTF-8 的遷移。