导入时默认数据库排序规则未受到尊重

3
在我的数据库中,排序规则最初是utf8_general_ci。但是,我注意到由于更好的排序准确性,需要使用utf8_unicode_ci

因此,我使用phpmyadmin导出了整个数据库,并检查导出的sql文件中没有出现“COLLATION”一词(除了一个表中只出现了两次设置为二进制的情况),所以通常这个脚本不会在导入时使用特定的排序规则,而是使用数据库默认值。

删除所有表后,将数据库排序规则更改为utf8_unicode_ci,然后从phpmyadmin运行导入脚本。但结果是,所有表和所有列都再次显示为utf8_general_ci排序规则(并且排序不正确)。为什么?应该怎么做来改变它?

附注:导出/导入脚本在开头包含被注释掉的行:

/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;

我不知道在导入时是否会有任何影响,但是在打开mysql控制台后,命令show variables like 'collation_connection'显示COLLATION_CONNECTION为cp852_general_ci。然而,在phpmyadmin→变量中,变量'collation_connection'设置为utf8_general_ci。但是没有办法更改它。

1个回答

2

这是因为数据库导出时在每个表上设置了字符集,并且该子句带有一个默认排序规则,该排序规则取决于字符集,而不是您的连接的排序规则。 utf8_general_ci 是 utf8 的默认排序规则。

您需要使用类似以下命令来将数据表转换:ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 或者如果可行的话编辑数据库导出文件。

至于 MySQL 控制台:命令行客户端在 Windows 上基本上失效了。它永远不会支持、显示或读取 Unicode,并且您在该客户端中获取到的每个连接的排序规则匹配您的 Windows 所谓 OEM 字符集以及适用于您的语言环境的字符集。这是 Windows 的一个不良特性,很难在便携软件中解决。PHPMyAdmin 使用 Web 服务器,不会遇到这个问题。我建议您在任何情况下都使用类 UNIX 操作系统,例如 GNU/Linux 进行任何严肃的工作,而不仅仅是因为这个原因。此外,MySQL、Apache 和整个应用程序堆栈在 Linux 上执行得更好。


好的。为了简化生活,我找到了一个脚本,可以自动执行这些ALTERS,最终校对是正确的,数据库仍然可以工作。据我所知,在任何未来的导出/导入操作之后都需要做同样的事情(对于所有新表,因为对于现有表,导出脚本已经包含了一个COLLATE utf8_unicode_ci子句,适用于所有列)。实际上应该有一个每个数据库的设置。 - camcam
它依赖于导出而不是数据库的原因是排序规则可能会影响您存储的实际数据。例如,使用utf8_bin排序规则创建的主键或唯一键(区分大小写)可能会在直接在不同排序规则下导入时发生冲突和失败。 - Miguel Pérez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接