mysql 从 5.5 升级到 5.7 后的空查询
empty query after mysql upgrade from 5.5 to 5.7
我正在开发一个 laravel 4.2 应用程序,该应用程序是 运行 在 mysql 5.5 上运行的。此应用已迁移到新服务器,现在 运行 为 mysql 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 eloquent 生成的查询。它returns 是空的。在旧 mysql 5.5 上它 returns 符合预期的一行。
如果从主查询中修复了 id,它就可以工作。
... WHERE `table2`.`table1_id` = 86 ...
正如我之前所说,我认为这与 sql_mode 有关。
有什么想法吗?
在大多数支持它的数据库中,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
查询没有问题,确实可以更改查询来避免问题,但这并不能解决真正的问题。
解决方案是在optimizer_switch配置中禁用index_merge_intersection。
这是在 mysql 5.7 上发现的错误
https://bugs.mysql.com/bug.php?id=79675
对我有用。
我正在开发一个 laravel 4.2 应用程序,该应用程序是 运行 在 mysql 5.5 上运行的。此应用已迁移到新服务器,现在 运行 为 mysql 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 eloquent 生成的查询。它returns 是空的。在旧 mysql 5.5 上它 returns 符合预期的一行。
如果从主查询中修复了 id,它就可以工作。
... WHERE `table2`.`table1_id` = 86 ...
正如我之前所说,我认为这与 sql_mode 有关。
有什么想法吗?
在大多数支持它的数据库中,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
查询没有问题,确实可以更改查询来避免问题,但这并不能解决真正的问题。
解决方案是在optimizer_switch配置中禁用index_merge_intersection。
这是在 mysql 5.7 上发现的错误 https://bugs.mysql.com/bug.php?id=79675
对我有用。