2017-06-06 80 views
0

我面临一些奇怪的排序问题,我真的不明白。我有两列或三列含有波兰语重音字母的表,如“英镑”。由于此字母的出现,utf8_unicode_520_ci整理最适合我的目的。我在我的PHP页面中遇到了这个问题。 Webserver运行Apache 2.4,PHP 7.1.0,MySQL 5.7。MYSQL:错误的排序规则是挑选的查询

连接到数据库后,我设置的字符集和校对规则是这样的:

$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; 

这retrun以下结果:

Łapsze Wyżne 
Łapsze Wyżne 
Zvolenská Slatina 
Župčany 
Župčany 

输入“ŁapszeWyżne”不应被列为最后按utf8_unicode_520_ci整理它应该与从正常的“L”字符开始的条目一起列出。所以很显然,它选择了其他排序规则,然后是utf8_unicode_520_ci.I认为是utf8_general_ci排序规则使用了什么(从结果顺序猜测)。表和列“birthPlace”的整理是utf8_unicode_520_ci。我预计整理优先级将分别是默认的列,表,数据库。

phpMyAdmin和MySQL Workbench按预期排序条目。但我的脚本没有按预期排序。

所以我的问题是真的是用什么整理如果没有明确的查询设置以及如何解决它,如果没有可能修改查询。

编辑:问题本身不是关于如何选择适当的归类,因为我已经知道并定义排序是正确的我对我能控制所有地方的目的。如果在SELECT查询中未定义爆炸式定义,则使用排序规则。它是连接,列,表,数据库还是服务器的整理?或者它是使用字符集的默认排序规则(在我的情况下,对于uth8字符集,它是utf8_general_ci?从文档中我不清楚)我希望通过utf8_unicode_520_ci默认排序结果,而不在将来运行的每个查询中定义结果。这是可能的吗?

回答

0

因为这个问题似乎更多的是关于波兰的排序规则,而不约“最好的PHP”,我重新打开它。

utf8_unicode_520_ci对待L=l=Ĺ=ĺ=Ļ=ļ=Ł=ł。几乎所有其他UTF8归类治疗L=l=Ĺ=ĺ=Ļ=ļ < Ł=ł,特别Ł为有效LM之前出现的信。

如果波兰语是数据库的主要内容,我建议你考虑utf8_polish_ci。请注意,C,N,O,S,Z上的重音符号可能(或不可能)按照您在此归类中希望的方式进行处理。

请参阅了解MySQL各种utf8归类中字母排序的顺序。

治疗Ł的'责任'转到Unicode版本5.20。 Unicode 9.0也以同样的方式工作。

通过MySQL 5.7,“最适合PHP”(或任何其他一般应用程序)是utf8mb4_unicode_520_ci。在MySQL 8.0中,utf8mb4_0900_ai_ci可能被认为是“最好的”。

(注:CHARACTER SET UTF8是大多数语言不够好utf8mb4是一个超集,用表情符号,并加入中国其他地区。)