我正面临一些奇怪的整理问题,我真的不明白。我在两三列中都有包含波兰重音字母的表格,如“Ł”。由于这些字母的出现, utf8_unicode_520_ci 整理最适合我的目的。我在PHP页面中遇到了这个问题。 Webserver正在运行Apache 2.4,PHP 7.1.0,MySQL 5.7。
连接到数据库后,我以这种方式设置charset和collation:
$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
条目“ŁapszeWyżne”不应列为 utf8_unicode_520_ci整理的最后一项,应列出以正常“ L “性格。所以很明显它正在选择其他整理然后utf8_unicode_520_ci。我认为是utf8_general_ci整理使用的东西(从结果顺序猜测)。表和列“birthPlace”的整理是utf8_unicode_520_ci。我期望整理优先级分别是默认列,表,数据库。
phpMyAdmin和MySQL Workbench按预期排序条目。但我的脚本没有按预期排序。
所以我的问题是如果没有在查询中明确设置并且如果可能的话在不修改查询的情况下如何解决它,那么真正使用的是排序规则。
编辑:问题本身不是关于选择正确的整理,因为我已经知道并定义了整理,这对于我能够控制的所有地方来说都是正确的。问题是如果在SELECT查询中没有明确定义,则使用排序规则。它是连接,列,表,数据库还是服务器的排序规则?或者它是使用的字符集的默认排序规则(在我的情况下,对于uth8字符集,它是utf8_general_ci?对于我来说,文档中我不清楚。我想在默认情况下通过utf8_unicode_520_ci排序结果,而不是在将来运行的每个查询中定义它。有可能吗?
答案 0 :(得分:0)
由于这个问题似乎更多是关于波兰语的整理,而不是关于PHP"最好的,我重新打开它。
utf8_unicode_520_ci
对待L=l=Ĺ=ĺ=Ļ=ļ=Ł=ł
。几乎所有其他utf8校对都会处理L=l=Ĺ=ĺ=Ļ=ļ < Ł=ł
。特别是,Ł
实际上是L
之后和M
之前的字母。
如果波兰语是数据库的主要内容,我建议您考虑utf8_polish_ci
。请注意,C,N,O,S,Z上的重音符号可能(或可能不)按照您在此排序规则中的方式进行处理。
请参阅this,了解MySQL的各种utf8排序规则中字母的排序。
责备&#39;对于Ł
的处理,在其5.20版本中使用Unicode。 Unicode 9.0的工作方式也相同。
最适合PHP&#34; (或任何其他一般应用程序)通过MySQL 5.7 utf8mb4_unicode_520_ci
。在MySQL 8.0中,utf8mb4_0900_ai_ci
可能被认为是最好的&#39;。
(注意:CHARACTER SET
utf8对大多数语言来说已经足够了.utf8mb4是一个超集,其中添加了Emoji和其他中文。)