【问题标题】:Which MySQL collation exactly matches PHP's string comparison?哪个 MySQL 排序规则与 PHP 的字符串比较完全匹配?
【发布时间】: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? 的副本,但这似乎更主观,我正在寻找特定问题的具体答案

其他说明:

【问题讨论】:

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

标签: php mysql pdo character-encoding collation


【解决方案1】:
echo ('a' == 'A') ? 'a==A ' : 'a <> A ';
echo ('a' == 'á') ? 'a==á ' : 'a <> á ';

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2014-07-14
    • 1970-01-01
    • 2014-05-20
    相关资源
    最近更新 更多