SQL错误(1064)从SQL文件导入数据时

我有一个MySQL数据库,它最初是使用默认的latin1字符集和latin1_swedish_cisorting规则设置的。 我曾经这样使用数据库,直到我注意到我的生产网站上有奇怪的字符,这个字符是由我的开发机器导出的数据库驱动的。

此时,我将数据库和表的默认字符集更改为utf8 ,将sorting规则更改为utf8_unicode_ci ,将每个表内的latin1数据转换为utf8 (使用“convert data”选项),并将数据库导出为单个SQL文件使用HeidiSQL。

当在记事本++中打开生成的SQL文件时,几个字符呈现不正确。 例如,虚线( – )显示为– ,带重音符号(e)的e显示为“ é

我将文件的编码ANSI更改为UTF-8 (使用Notepad ++中的编码菜单选项),并且正确地呈现违规字符。 我保存了新的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 # -------------------------------------------------------- 

它扼杀在文件的第一行,这是注释。 为什么发生这种情况? 在我更改数据库的字符集和sorting规则之前,我没有从SQL文件加载数据的问题。

我想出了一个丑陋的解决方法,通过执行以下步骤来解决这个问题:

  • 使用HeidiSQL将数据库导出为单个SQL文件
  • 在Notepad ++中打开结果文件,并从ANSI转换为UTF-8编码
  • 在Notepad ++中创build新的空文件,粘贴UTF-8并正常保存文件

我在这里错过了什么?

您的编辑器可能确实在文件的开头插入了一个BOM“字节顺序标记”。

这是您的编辑器的不良行为,因为BOM在UTF-8编码中没有用处,它只在UTF-16或UTF-32中有用。 但是,这种行为似乎在几个编辑中很常见。

或者,有一种方法可以指定您不需要文件中的BOM(例如,在Mac上的TextWrangler中,使用“UTF-8 no BOM”编码),或者应该使用任何应用程序删除2个第一个字节能够…