哪个 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 <> á ';
两者都返回 <>
,所以我推断 PHP 的行为类似于 latin1_bin
(或您拥有的任何字符集的 _bin
)。
【讨论】:
以上是关于哪个 MySQL 排序规则与 PHP 的字符串比较完全匹配?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 排序规则类型是不是需要匹配 PHP 页面字符集类型?