【问题标题】:empty query after mysql upgrade from 5.5 to 5.7mysql 从 5.5 升级到 5.7 后的空查询
【发布时间】:2016-12-19 22:24:22
【问题描述】:

我正在开发一个在 mysql 5.5 上运行的 laravel 4.2 应用程序。此应用迁移到新服务器,现在运行 mysql 5.7。

升级后,一些查询现在返回空。

我相信这与mysql 5.7引入的sql_mode有关。

查询示例

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 产生的查询。它返回空。在旧的 mysql 5.5 上,它按预期返回一行。

如果修复了主查询中的 id,它就可以工作。

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

正如我之前所说,我认为这与 sql_mode 有关。

有什么想法吗?

【问题讨论】:

  • " ` " 在 where 子句中的 table1 之前缺失。
  • 抱歉,我在粘贴问题时打错了字。这就是 Laravel Eloquent 重现的 sql。出于隐私考虑,我刚刚更改了表格和列名称。
  • 如果我将“count(*)”更改为“count(table.id)”,它就可以工作。敲钟了吗?

标签: php mysql laravel-4 mysql-5.7 sql-mode


【解决方案1】:

查询没有问题,确实可以更改查询来避免问题,但这并不能解决真正的问题。

解决方案是在 optimizer_switch 配置中禁用 index_merge_intersection

这是在 mysql 5.7 上发现的错误 https://bugs.mysql.com/bug.php?id=79675

它对我有用。

【讨论】:

    【解决方案2】:

    在大多数支持它的数据库中,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
    

    【讨论】:

    • 我明白,但这是 Laravel Eloquent ORM 复制的代码。我相信解决方案是在 sql_mode 配置上。我现在有默认值。你怎么看?
    猜你喜欢
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2015-03-08
    • 1970-01-01
    • 2015-10-11
    • 2021-07-08
    相关资源
    最近更新 更多