我尝试使用 Zend Db 连接表中使用不同排序规则的两列,但收到此错误:
Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '=')
在 Google 上搜索并在 Stackoverflow 上找到一些问题后,我将 COLLATE utf8_unicode_ci
添加到我的联接中,如下所示:
$select = $this->getSql()->select();
$select->columns(['*', new Expression('count(*) as count')]);
$select->join(
['tbl2' => 'table2'],
'table1.name COLLATE utf8_unicode_ci = tbl2.name',
['person_id' => 'id'],
$select::JOIN_LEFT
);
但现在我得到了一个不同的错误:
...
could not be executed (42000 - 1064 - You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for
the right syntax to use near '`COLLATE` `utf8_unicode_ci`
这是因为 Zend 自动为我反引用关键字 COLLATE
,但我想在 join
条件中使用保留字。
最佳答案
理想情况下,您应该更改排序规则以使两者匹配,然后您可以使用该条件连接这些表,而无需使用 COLLATE
关键字。我不确定,但我猜想在联接中使用 COLLATE
可能会影响性能。
如果您无法更改架构,那么您可以在字符串连接上使用 Predicate\Expression
来代替,这似乎绕过了自动引用:
$select = $this->getSql()->select();
$select->columns(['*', new Expression('count(*) as count')]);
$select->join(
['tbl2' => 'table2'],
new \Zend\Db\Sql\Predicate\Expression('table1.name COLLATE utf8_unicode_ci = table2.name'),
['person_id' => 'id'],
$select::JOIN_LEFT
);
或者我想你可以绕过使用 Zend 并自己手写 SQL 语句..
关于php - Zend Db 使用 COLLATE 时出现非法排序规则和语法错误混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56235437/