Zend Db 使用 COLLATE 的排序规则和语法错误的非法混合
Zend Db Illegal mix of collations and sytnax error using COLLATE
我试图使用 Zend Db 连接表中使用不同排序规则的两列,但出现此错误:
Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '=')
在谷歌搜索并在 Whosebug 上找到一些问题后,我将 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 语句..
我试图使用 Zend Db 连接表中使用不同排序规则的两列,但出现此错误:
Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '=')
在谷歌搜索并在 Whosebug 上找到一些问题后,我将 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 语句..