Mysql
從 SQL 文件導入數據時出現 SQL 錯誤 (1064)
我有一個 MySQL 數據庫,它最初是使用預設
latin1
字元集和latin1_swedish_ci
排序規則設置的。我一直在使用這樣的數據庫,直到我注意到我的生產網站上有奇怪的字元,該網站由從我的開發機器導出的數據庫提供支持。此時,我將數據庫和表的預設字元集更改為
utf8
,將排序規則更改為utf8_unicode_ci
,將latin1
每個表中的數據轉換為utf8
(使用“轉換數據”選項)並使用 HeidiSQL 將數據庫導出為單個 SQL 文件。在 Notepad++ 中打開生成的 SQL 文件時,有幾個字元呈現不正確。例如,短劃線 (-) 顯示為
–
,帶重音符號 (é) 的 e 顯示為é
。我將文件的編碼從更改
ANSI
為UTF-8
(使用記事本++ 中的編碼菜單選項),並且正確呈現了違規字元。我保存了新的 utf8 編碼的 SQL 文件,並嘗試將內容導入生產伺服器上的 MySQL 數據庫。導入過程失敗並出現以下錯誤:/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?# -------------------------------------------------------- # Host: ' at line 1 */ /* Error with snippets directory: The specified path was not found */
SQL 文件的頭部:
# -------------------------------------------------------- # Host: 127.0.0.1 # Server version: 5.1.33-community # Server OS: Win32 # HeidiSQL version: 6.0.0.3773 # Date/time: 2011-04-20 09:48:36 # --------------------------------------------------------
它阻塞在文件的第一行,被註釋掉了。為什麼會這樣?在更改數據庫的字元集和排序規則之前,我從 SQL 文件載入數據沒有問題。
通過執行以下步驟,我想出了一個醜陋的解決方法:
- 使用 HeidiSQL 將數據庫導出為單個 SQL 文件
- 在 Notepad++ 中打開生成的文件並將 ANSI 轉換為 UTF-8 編碼
- 在 Notepad++ 中新建一個空文件,粘貼為 UTF-8 並正常保存文件
我在這裡想念什麼?
您的編輯器可能確實在文件開頭插入了 BOM“字節順序標記”。
這是您的編輯器的不良行為,因為 BOM 在 UTF-8 編碼中沒有用,它僅在 UTF-16 或 UTF-32 中有用。但是,這種行為似乎在幾個編輯器中很常見。
或者,有一種方法可以指定您不希望文件中包含 BOM(例如,在 Mac 上的 TextWrangler 中,使用“UTF-8 no BOM”編碼),或者您應該使用任何應用程序刪除前 2 個字節能夠…