2016-12-16 2 views
1

Я работаю над приложением laravel 4.2, которое запускалось на mysql 5.5. Это приложение перенесено на новый сервер, теперь запущен mysql 5.7.пустой запрос после обновления mysql от 5.5 до 5.7

После обновления некоторые запросы теперь возвращаются пустым.

Я считаю, что это как-то связано с sql_mode mysql 5.7.

Пример запроса

SELECT * FROM `table1` WHERE `col1` = 'val1' and 
(SELECT count(*) FROM `table2` 
WHERE `table2`.`table1_id` = `table1`.`id` 
    and `driver_id` = '39') >= 1 and `table1`.`id` = '86' LIMIT 1 

Это запрос, который производит Laravel красноречив. Он возвращает пустой. На старом mysql 5.5 он возвращает одну строку, как ожидалось.

Если исправлено id из основного запроса, он работает.

... WHERE `table2`.`table1_id` = 86 ... 

Как я уже говорил, я считаю это чем-то связанным с sql_mode.

Любые мысли?

+1

"' "отсутствует перед таблицей 1 в разделе where. –

+0

Извините, это была опечатка, когда я вставил вопрос. Это код Laravel Eloquent воспроизводится. Я просто изменил имена таблиц и колос для конфиденциальности. – cmancre

+0

Если я изменил счетчик (*) "на" count ('table'.'id'), он будет работать. Звонит в колокол? – cmancre

ответ

1

Там нет ничего плохого с запросом, это правда, что вы можете изменить запрос, чтобы избежать этой проблемы, но это не решает реальную проблему.

Решение состоит в том, чтобы отключить index_merge_intersection в optimizer_switch конфигурации.

Это ошибка находится на MySQL 5.7 https://bugs.mysql.com/bug.php?id=79675

Он работал для меня.

0

В большинстве баз данных, которые поддерживают его, count(*) фактически не получить все записи и сосчитать их - вместо этого он получает некоторое поле метаданных, просто отслеживает количество строк

Конечно, это разумно ожидать, что, независимо от того, как он реализован, результат count(*) будет таким же, как более сложный, но эквивалентный запрос.

SELECT * FROM `table1` WHERE `col1` = 'val1' and 
(SELECT count(`table2`.`id`) FROM `table2` 
WHERE `table2`.`table1_id` = `table1`.`id` 
and `driver_id` = '39') >= 1 and `table1`.`id` = '86' LIMIT 1 

или для получения булевых попробовать это

SELECT * FROM `table1` WHERE `col1` = 'val1' and 
(SELECT 1 FROM `table2` 
WHERE `table2`.`table1_id` = `table1`.`id` 
and `driver_id` = '39') >= 1 and `table1`.`id` = '86' LIMIT 1 
+0

Я понимаю, но это код, воспроизведенный Laravel Eloquent ORM. Я считаю, что решение находится в конфигурации sql_mode. У меня есть значение по умолчанию. Как вы думаете? – cmancre

Смежные вопросы