导入时不遵守默认数据库排序规则

Posted

技术标签:

【中文标题】导入时不遵守默认数据库排序规则【英文标题】:default database collation not respected while importing 【发布时间】:2012-06-10 05:46:33 【问题描述】:

在我的数据库中,排序规则最初是 utf8_general_ci。但是,我注意到 utf8_unicode_ci 是必要的,因为它的排序精度更高。

所以我使用 phpmyadmin 导出了所有数据库,并检查了导出的 sql 文件中没有出现“COLLATION”一词(除了在一个设置为二进制的表中只有 2 次),所以通常这个脚本与排序规则无关,并且导入时不应暗示任何特定的排序规则,而是使用数据库默认值。

删除所有表后,数据库排序规则更改为 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->variables 中,变量 'collat​​ion_connection' 设置为 utf8_general_ci。但是没有办法改变它。

【问题讨论】:

【参考方案1】:

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

您必须使用 ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 之类的东西转换您的表格,或者如果可以负担得起的话,编辑您的数据库导出。

至于 MySQL 控制台:命令行客户端在 Windows 上几乎无法使用。它永远不会支持、显示或读取 Unicode,并且您将获得该客户端的 per-connection 排序规则,该排序规则与您的区域设置的 Windows 所谓的 OEM 字符集相匹配。这是 Windows 的一个错误功能,在便携式软件中很难解决。 PHPMyAdmin 使用网络服务器,不会遇到这个问题。我建议您在任何情况下都使用类似 UNIX 的操作系统(如 GNU/Linux)来进行任何严肃的工作,而不仅仅是因为这个原因。另外一个好处是,MySQL、Apache 和您的整个应用程序堆栈在 Linux 上的性能更好。

【讨论】:

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

以上是关于导入时不遵守默认数据库排序规则的主要内容,如果未能解决你的问题,请参考以下文章

在 phpmyadmin 中更改默认排序规则

如何为数据库中创建的所有表设置默认排序规则?

mysql查询时不区分大小写

SQL Server转换数据库的排序规则

数据库默认的排序规则是怎样的 还有 如果按照我想要的方式做排序要怎么写

如何使用 tslint 的导入排序规则对导入进行排序