php - Zend Db 使用 COLLATE 时出现非法排序规则和语法错误混合

标签 php mysql zend-db

我尝试使用 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/

相关文章:

php - 使用 zend db 插入 .. select from ..

php - 使用 PHP 剥离 HTML 注释但保留条件

php - Jquery - 根据 sql 结果的值更改字体颜色

php - 使用 PHP 脚本转发电子邮件

java - 如何选择 MySQL 表中的最后一行?我没有任何自动递增键

php - Zend Join 左警告 : Select query cannot join with another table in/var/www/myiartz/library/Zend/Db/Select. php

Windows 上的 PHP : How to use web services with the logged on user's identity?

javascript - 制作搜索功能ajax

php - 批处理未插入到表中

php - Zend 数据库适配器 mysqli 或 PDO_MYSQL