【问题标题】:MYSQL: Incorrect collation is picked for queryMYSQL:选择不正确的排序规则进行查询
【发布时间】: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 collat​​ion 列在最后,它应与以正常“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 排序结果,而不是在我将来运行的每个查询中定义它。有可能吗?

【问题讨论】:

    标签: php mysql utf-8 collation


    【解决方案1】:

    由于这个问题似乎更多的是关于波兰排序规则而不是“最适合 PHP”,所以我重新打开了它。

    utf8_unicode_520_ci 对待L=l=Ĺ=ĺ=Ļ=ļ=Ł=ł。几乎所有其他 utf8 排序规则都处理 L=l=Ĺ=ĺ=Ļ=ļ < Ł=ł。特别是,Ł 实际上是一个出现在L 之后和M 之前的字母。

    如果波兰语是数据库的主要内容,我建议您考虑utf8_polish_ci。请注意,在此排序规则中,C、N、O、S、Z 上的重音可能(也可能不会)按照您希望的方式处理。

    请参阅this,了解 MySQL 的各种 utf8 排序规则中的字母顺序。

    处理Ł 的“责任”归咎于 Unicode 5.20 版本。 Unicode 9.0 也以同样的方式工作。

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

    (注意:CHARACTER SETutf8 对于大多数语言来说已经足够了。utf8mb4 是一个超集,添加了表情符号和其他中文。)

    【讨论】:

      猜你喜欢
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 2011-04-19
      相关资源
      最近更新 更多