使用 phpMyAdmin 匯入 SQL 檔案時遇到 `#1064 - You have an error in your SQL syntax` 錯誤,且錯誤訊息顯示亂碼(如 `涓繪`、`琛ㄧ`),通常是字元編碼不匹配或SQL 檔案損壞/格式錯誤導致。本文提供分層排查與解決步驟。
錯誤現象分析
- 錯誤行附近出現非 ASCII 字元(中文亂碼),表明 SQL 檔案編碼與資料庫/連線編碼不一致。
- 錯誤位置在 `INSERT` 語句中間,可能是某欄位資料包含未轉義的特殊字元(單引號、反斜線、換行符)。
- phpMyAdmin 網頁介面上傳大檔案易超時或截斷,導致 SQL 語句不完整。
解決方案:由易至難
方法一:命令列 `source` 指令(最穩健,推薦大檔案)
# 1. 進入 MySQL 客戶端
mysql -u root -p
# 2. 選擇目標資料庫
mysql> USE your_database_name;
# 3. 執行匯入(指定絕對路徑,避免路徑問題)
mysql> SOURCE /full/path/to/backup.sql;
# 或單行指令
mysql -u root -p your_database_name < /full/path/to/backup.sql
優點:繞過 PHP/WEB 伺服器限制(上傳大小、執行時間、記憶體),直接由 MySQL 核心解析,支援超大檔案(GB 級)。
方法二:確認並統一字元編碼
- 檢查 SQL 檔案編碼:使用 Notepad++、VS Code 或 `file -i backup.sql` 確認編碼(應為 UTF-8 或 UTF-8MB4)。
- 資料庫/資料表編碼:
SHOW VARIABLES LIKE 'character_set%';
SHOW CREATE DATABASE your_db;
SHOW CREATE TABLE your_table;
- 匯入前設定連線編碼(命令列):
mysql> SET NAMES utf8mb4;
mysql> SET CHARACTER SET utf8mb4;
mysql> SOURCE /path/backup.sql;
方法三:phpMyAdmin 匯入前處理
- 將 SQL 檔案以 UTF-8 (無 BOM) 編碼儲存。
- 在 phpMyAdmin 匯入頁面,「檔案字元集」選擇 `utf-8` 或 `utf8mb4`。
- 「SQL 相容性模式」選 `NONE` 或 `MYSQL40`。
- 若檔案 > 2MB,修改 `php.ini`:`upload_max_filesize`、`post_max_size`、`max_execution_time`、`memory_limit`。
方法四:修復損壞的 SQL 檔案
若檔案確實損壞(截斷、亂碼):
- 使用 `head -n 100 backup.sql`、`tail -n 100 backup.sql` 檢查首尾完整性。
- 尋找錯誤行附近的 `INSERT` 語句,檢查欄位值是否包含未轉義單引號(如 `O'Reilly` 應為 `O\'Reilly`)。
- 使用 `sed` 或 Python 腳本批次修復:
sed -i "s/\\'/''/g" backup.sql(MySQL 單引號轉義為雙單引號)。
- 若為 mysqldump 產出,重新匯出並加參數:`--default-character-set=utf8mb4 --hex-blob --skip-extended-insert`。
預防最佳實務
- 統一資料庫、資料表、連線、備份檔案編碼為 **utf8mb4**(支援 Emoji)。
- 定期使用 `mysqldump --single-transaction --routines --triggers --events` 完整備份。
- 大型資料庫避免 phpMyAdmin 匯入/匯出,改用命令列或 Percona XtraBackup。
- 備份檔案儲存前驗證:`mysql -u root -p test_db < backup.sql` 在測試庫跑一次。
遇到 1064 語法錯誤不要慌,優先用命令列 `source` 繞過中介層,再檢查編碼一致性,多數情況即可解決。