尽管 sql_mode 为空白,但存储过程引发“与 sql_mode=only_full_group_by 不兼容”
Posted
技术标签:
【中文标题】尽管 sql_mode 为空白,但存储过程引发“与 sql_mode=only_full_group_by 不兼容”【英文标题】:Stored procedure raising "incompatible with sql_mode=only_full_group_by" despite sql_mode being blank 【发布时间】:2018-01-15 13:44:36 【问题描述】:我有一个在 mysql 5.6 上运行良好的存储过程。在最近的一次服务器迁移中,我们升级到了 MySQL 5.7.19。
我的存储过程现在抛出错误:
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'utility-monitor.daily_readings.building_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by: CALL monthly_readings(2017, 1, NULL, 1, 1))
我已经通过/var/mysql/my.cnf
文件将sql_mode
设置为""
,重启mysql服务并通过控制台登录以确认sql_mode
通过SELECT @@sql_mode;
为空
尽管如此,当我尝试运行我的存储过程时,我仍然收到上述错误。
接下来我该怎么做才能继续排查此错误的来源?
【问题讨论】:
ONLY_FULL_GROUP_BY
是 MySQL 5.7 中的默认值。
***.com/questions/23921117/disable-only-full-group-by 看看这个
【参考方案1】:
根据documentation,MySQL 使用您创建过程时激活的 sql 模式:
MySQL 存储在创建或更改例程时生效的 sql_mode 系统变量设置,并始终使用此设置执行例程,而不管例程开始执行时当前服务器 SQL 模式如何。
所以重新创建过程(或全部,因为它可能不是唯一受影响的)激活不同的模式(或修复group by
语法)。 更改该过程虽然在文档中有所提及,但还不够。您应该考虑不要为此永久更改 sql 模式(尽管您可能还有其他不兼容的代码)。
【讨论】:
这非常有帮助,感谢 Solarflare。 MySql 人设计它是为了帮助处理从另一个数据库导入的工作对象,起初它真的很方便,但是当您需要在其新模式中更改该对象时,这是一个非常痛苦的调试过程。以上是关于尽管 sql_mode 为空白,但存储过程引发“与 sql_mode=only_full_group_by 不兼容”的主要内容,如果未能解决你的问题,请参考以下文章
Dapper 执行存储过程引发关于多映射的 ArgumentException
MySQL sql_mode 说明(及处理一起 sql_mode 引发的问题)
s-s-rs 报告在浏览器上显示空白 2997 行数据,存储过程时间为 42 秒