我有一个 MySQL 数据库,最初设置了默认latin1
字符集和latin1_swedish_ci
排序规则。我这样使用数据库有一段时间了,直到我注意到我的生产网站上有奇怪的字符,该网站由从我的开发机器导出的数据库提供支持。
此时,我将数据库和表的默认字符集更改为,utf8
并将排序规则更改为,将每个表中的数据utf8_unicode_ci
转换为(使用“转换数据”选项),并使用 HeidiSQL 将数据库导出为单个 SQL 文件。latin1
utf8
在 Notepad++ 中打开生成的 SQL 文件时,几个字符显示不正确。例如,短划线 (-) 显示为,–
带重音符号的 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
# --------------------------------------------------------
它在文件的第一行被注释掉时卡住了。为什么会发生这种情况?在我更改数据库的字符集和排序规则之前,我从 SQL 文件加载数据时没有遇到问题。
我想出了一个解决这个问题的糟糕办法,即执行以下步骤:
- 使用 HeidiSQL 将数据库导出为单个 SQL 文件
- 在 Notepad++ 中打开生成的文件并将它从 ANSI 转换为 UTF-8 编码
- 在 Notepad++ 中创建新的空文件,以 UTF-8 格式粘贴并正常保存文件
我在这里遗漏了什么?
答案1
您的编辑器可能确实在文件开头插入了 BOM“字节顺序标记”。
这是编辑器的不良行为,因为 BOM 在 UTF-8 编码中毫无用处,仅在 UTF-16 或 UTF-32 中有用。不过,这种行为似乎在多个编辑器中很常见。
或者,有一种方法可以指定您不希望文件中出现 BOM(例如在 Mac 上的 TextWrangler 中,使用“UTF-8 no BOM”编码),或者您应该使用任何可以使用的应用程序删除前 2 个字节......