情景再现:
今天安装完8.0.16版本的Mysql,在写sql用的group by的时候报错。
报错:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'sky.orders.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
同样的SQL语句,在mysq8.0.16的数据库中报错,在5.7.5的mysql数据库中却正常。
分析:
对于上述的报错信息,我在查阅资料后的理解是因为select字段里包含了没有被group by条件唯一确定的字段status。因为执行sql_make_group语句实际上把两行纪录选择一行进行输出,但搜索引擎不知道该返回哪一条,所以报错。
原因:
使用GROUP BY 语句违背了sql_mode=only_full_group_by。因为mysql版本5.7之后默认的模式是ONLY_FULL_GROUP_BY。
查看官方文档,发现从 MySQL 5.7.5 开始,默认 SQL 模式包括 ONLY_FULL_GROUP_BY。 (在 5.7.5 之前,MySQL 不检测函数依赖,并且默认不启用 ONLY_FULL_GROUP_BY。)这可能会导致一些sql语句失效。
解决方法:
方法一(表面方法):
1、查询 sql_mode
show variables like '%sql_mode%'
2、查看是否出现 ONLY_FULL_GROUP_BY
3、去掉 ONLY_FULL_GROUP_BY
set global sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
4、把当前会话的 sql_mode 也去掉
set session sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
注意这种方法一旦数据库服务重启就会失效
方法二(根本方法):
执行命令修改配置文件,windows下是my.ini,Linux是my.cnf。
如果中有sql_mode配置,则将ONLY_FULL_GROUP_BY去掉。
如果没有,则将下面内容放到相应位置
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
wq保存并退出
重启MySQL
service restart mysqld
已解决。