在我的数据库中,排序规则最初是 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 中,变量 'collation_connection' 被设置为 utf8_general_ci。但是没有办法改变它。
最佳答案
发生这种情况是因为数据库导出正在为每个表设置字符集,并且这样的子句带有默认排序规则,该排序规则取决于字符集,而不是连接的排序规则。 utf8_general_ci 是 utf8 的默认排序规则。
您必须使用类似 ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
之类的方法来转换您的表,或者如果可以的话,编辑您的数据库导出。
至于 MySQL 控制台:命令行客户端在 Windows 上几乎无法使用。它永远不会支持、显示或读取 Unicode,并且您将获得该客户端的每连接 排序规则,该排序规则与您的 Windows 所谓的区域设置的 OEM 字符集相匹配。这是 Windows 的一个错误功能,很难在可移植软件中解决。 PHPMyAdmin 使用 Web 服务器,不会遇到此问题。我建议您在任何情况下都使用 GNU/Linux 之类的类 UNIX 操作系统来处理任何严肃的工作,而不仅仅是因为这个原因。作为一个额外的好处,MySQL、Apache 和您的整个应用程序堆栈在 Linux 上表现更好。
关于mysql - 导入时不遵守默认数据库排序规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10910350/