哪个 MySQL 排序规则与 PHP 的字符串比较完全匹配?

Posted

技术标签:

【中文标题】哪个 MySQL 排序规则与 PHP 的字符串比较完全匹配?【英文标题】:Which MySQL collation exactly matches PHP's string comparison? 【发布时间】:2016-11-08 18:15:16 【问题描述】:

这是一个 mysql 查询:

SELECT last_name FROM users ORDER BY last_name

我们将所有数据输入 php,然后运行:

$prior = NULL;
do 
    $current = array_shift($results);
    assert($current >= $prior);
    $prior = $current;
 while ($current !== NULL);

目前,对于某些输入,此断言失败。是否可以在上面的 MySQL 查询中添加 COLLATE 子句以绝对保证 PHP 断言?


我尝试过的东西:

以上代码,不适用于某些非 ASCII 输入 ORDER BY email COLLATE utf8_bin 导致 COLLATION 'utf8_bin' is not valid for CHARACTER SET 'latin1' 也许这是 What is the best collation to use for MySQL with PHP? 的副本,但这似乎更主观,我正在寻找特定问题的具体答案

其他说明:

如果有影响的话,这个栏目是latin1 我的 PHP PDO 包装库是 https://github.com/fulldecent/thin-pdo

【问题讨论】:

你在哪里设置$next 您可以使用ORDER BY email COLLATE 'latin1_bin',或者您可以将列的排序规则设置为utf8,但您不能通过查询中的其他子集进行排序。 您在 2016 年使用 latin1 列有什么原因吗?这似乎过于严格了。 @cmorrissey,谢谢你的代码更正 @tadman 谢谢,我举报了上游github.com/sequelpro/sequelpro/issues/2530 【参考方案1】:
echo ('a' == 'A') ? 'a==A ' : 'a <> A ';
echo ('a' == 'á') ? 'a==á ' : 'a <> á ';

两者都返回 &lt;&gt;,所以我推断 PHP 的行为类似于 latin1_bin(或您拥有的任何字符集的 _bin)。

【讨论】:

以上是关于哪个 MySQL 排序规则与 PHP 的字符串比较完全匹配?的主要内容,如果未能解决你的问题,请参考以下文章

请你说说MySQL的字符集与排序规则对开发有哪些影响?

MySQL 排序规则类型是不是需要匹配 PHP 页面字符集类型?

Mysql 排序规则选择

当我在Mysql存储Base64数据时,崩了!!

SQL Server 与MySQL中排序规则与字符集相关知识的一点总结

MySQL字符集与排序规则 北京MySQL DBA学习