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 语句..