Zend Db Неверное сочетание параметров сортировки и ошибки синтаксиса с использованием COLLATE - PullRequest
0 голосов
/ 21 мая 2019

Я пытался объединить два столбца в таблицах, которые использовали разные параметры сортировки, используя Zend Db, и я получил эту ошибку:

Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '=')

После поиска и поиска нескольких вопросов по 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.

1 Ответ

0 голосов
/ 21 мая 2019

В идеале вы должны изменить параметры сортировки, чтобы оба соответствовали друг другу, тогда вы можете объединить эти таблицы, используя это условие без ключевого слова 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 ..

...