Mysql

從 SQL 文件導入數據時出現 SQL 錯誤 (1064)

  • January 8, 2016

我有一個 MySQL 數據庫,它最初是使用預設latin1字元集和latin1_swedish_ci排序規則設置的。我一直在使用這樣的數據庫,直到我注意到我的生產網站上有奇怪的字元,該網站由從我的開發機器導出的數據庫提供支持。

此時,我將數據庫和表的預設字元集更改為utf8,將排序規則更改為utf8_unicode_ci,將latin1每個表中的數據轉換為utf8(使用“轉換數據”選項)並使用 HeidiSQL 將數據庫導出為單個 SQL 文件。

在 Notepad++ 中打開生成的 SQL 文件時,有幾個字元呈現不正確。例如,短劃線 (-) 顯示為–,帶重音符號 (é) 的 e 顯示為é

我將文件的編碼從更改ANSIUTF-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 個字節能夠…

引用自:https://serverfault.com/questions/261648