【发布时间】:2017-11-07 06:18:17
【问题描述】:
我遇到了一些我真的不明白的奇怪的整理问题。我有两列或三列包含波兰重音字母的表格,例如“Ł”。由于此字母的出现,utf8_unicode_520_ci 排序规则最适合我的目的。我在我的 PHP 页面中遇到了这个问题。网络服务器正在运行 Apache 2.4、PHP 7.1.0、MySQL 5.7。
连接到数据库后,我这样设置字符集和排序规则:
$connection->set_charset("utf8");
$connection->query("SET NAMES utf8 COLLATE utf8_unicode_520_ci;");
之后,我使用SHOW VARIABLES LIKE '%collat%'; 和SHOW VARIABLES LIKE '%char%'; 仔细检查实际字符集和排序规则,它们以格式化的形式返回以下信息:
collation_connection->utf8_unicode_520_ci
collation_database->utf8_unicode_520_ci
collation_server->binary
character_set_client->utf8
character_set_connection->utf8
character_set_database->utf8
character_set_filesystem->binary
character_set_results->utf8
character_set_server->binary
character_set_system->utf8
character_sets_dir->/usr/share/mysql/charsets/
到目前为止,一切似乎都是正确的。但是当我在下面运行查询时,我遇到了订购问题:
SELECT birthPlace FROM persons ORDER BY birthPlace DESC LIMIT 5;
返回以下结果:
Łapsze Wyżne
Łapsze Wyżne
Zvolenská Slatina
Župčany
Župčany
条目“Łapsze Wyżne”不应按 utf8_unicode_520_ci collation 列在最后,它应与以正常“L”开头的条目一起列出>”字符。所以很明显,它正在选择其他排序规则,然后是 utf8_unicode_520_ci。我认为使用的是 utf8_general_ci 排序规则(从结果顺序猜测)。表和列“birthPlace”的排序规则是 utf8_unicode_520_ci。我预计排序优先级将分别是默认列、表、数据库。
phpMyAdmin 和 MySQL Workbench 按预期对条目进行排序。但我的脚本没有按预期排序。
所以我的问题是,如果没有在查询中明确设置排序规则,以及如何在可能的情况下不修改查询来解决它,那么它真正使用的是什么排序规则。
编辑:问题本身并不是关于选择正确的排序规则,因为我已经知道并定义了正确的排序规则,这对于我能够控制的所有地方的目的都是正确的。如果在 SELECT 查询中没有明确定义,问题是使用什么排序规则。它是连接、列、表、数据库还是服务器的排序规则?或者它是使用的字符集的默认排序规则(在我的情况下,它是 utf8_general_ci 用于 uth8 字符集?这对我来说从文档中不清楚。我想在默认情况下按 utf8_unicode_520_ci 排序结果,而不是在我将来运行的每个查询中定义它。有可能吗?
【问题讨论】: