mysql 8.0 only_full_group_by设置相关报错

wylc123 1年前 ⋅ 994 阅读

前因

今天原本运行的好好的项目突然爆出了这么个Bug,简直莫名其妙,非常搞笑

SELECT list is not in GROUP BY clause and contains
nonaggregated column ‘sss.month_id’ which is not functionally
dependent on columns in GROUP BY clause; this is incompatible with
sql_mode=only_full_group_by

后果

原因好像是别的同事把mysql的only_full_group_by配置项打开了,导致所有group by语句相关的sql报错。

查询sql_mode
select @@global.sql_mode;
Markup

查询结果:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Markup

果然能看到only_full_group_by

 

解决方法

1.关闭ONLY_FULL_GROUP_BY模式
1.1 方法一

运行:

set @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
Markup

即设置sql_mode等于上面的查询结果去掉only_full_group_by
上面是改变了全局sql_mode,对于新建的数据库有效。对于已存在的数据库,则需要在对应的数据下执行

set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Markup

该方法在mysql重启后会失效。

1.2 方法二

可以先在cmd中执行:mysql --help

可以看到mysql的配置文件位置:

在配置文件,添加配置:

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=%MYSQL_HOME%
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 设置模式
sql_mode =STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

datadir = D:\mysql-5.7.27-winx64\data
Markup

注意这里的sql_mode 是配置在[mysqld]下面的
然后就是重启mysql服务

2.修改group by语句

需要在group by 后的字段之外的字段(非聚合函数字段)上添加any_value()函数

例如:

select sex,any_value(name),any_value(age),sum(grade) from class group by sex;
Markup


注意:本文归作者所有,未经作者允许,不得转载

更多内容请访问:IT源点
相关文章推荐

全部评论: 0

    我有话说: