关于sql_mode里的ONLY_FULL_GROUP_BY

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】7.1
【遇到的问题:问题现象及影响】
参考
SQL 模式 | PingCAP 文档中心

通过 select @@sql_mode可以查到
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

文档说
ONLY_FULL_GROUP_BY 如果 GROUP BY 出现的列并没有在 SELECT,HAVING,ORDER BY 中出现,此 SQL 不合法,因为不在 GROUP BY 中的列被查询展示出来不符合正常现象(支持)

测试了几种,发现都是正常返回的,如:
select loc_name,MAX(loc_type) from loc l group by l.loc_id;
select l.loc_id,loc_name,MAX(loc_type) from loc l group by l.loc_id;

请问不合法的是哪种?

是不是改了变量以后需要重新连接一下才会生效?

和你下面类似的sql,我执行后报错。

1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'battleLog.battlelog.datetime' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

你这个是session参数还是global参数

这种的是不合法的

没改过,就是默认的

默认的,没改过

我也觉得不合法,但是感觉没生效

这个参数是可以开启和关闭的吧?

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

你查询的应该是默认开启的呀,应该是GLOBAL级的。再查查SESSION?

配置没问题

在生产中也遇到过,如果group by没有出现对应的列会报错的,会提示sql_mode=only_full_group_by的错误

我环境试试



我这提示报错了啊

你那什么版本?
我这 5.7.25-TiDB-v7.1.1

我这里刚好相反,有这个配置但是不报错。。

测试的 5.7.25-TiDB-v7.1.0


5.7.25-TiDB-v7.1.0 测试会报错

你这个表不会是刚好loc_id和loc_name一一对应吧?你换个字段group by。

肯定是会报错的,可以在查询语句前set试试

我的也是报错,还是写标准一点好