2

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

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

删除所有表后,数据库排序规则更改为utf8_unicode_ci,然后从 phpmyadmin 运行导入脚本。但结果,所有表和所有列都使用utf8_general_ci排序规则再次显示(并且排序不正确)。为什么??以及如何改变它?

PS 导出/导入脚本在开头包含注释行:

/*!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。但是没有办法改变它。

4

1 回答 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 使用网络服务器,不会遇到这个问题。我建议您在任何情况下都使用类似 UNIX 的操作系统(如 GNU/Linux)来进行任何严肃的工作,而不仅仅是因为这个原因。作为一个额外的好处,MySQL、Apache 和您的整个应用程序堆栈在 Linux 上的性能更好。

于 2012-06-06T08:21:57.537 回答