MySQL报错:this is incompatible with sql_mode=only_full_group_by

错误场景

今天在自己电脑运行一个刚clone下来的项目,在登录完成进入主页的时候,报了一串this is incompatible with sql_mode=only_full_group_by 错误,我很确定之前在公司电脑上是不会有这个错误的,我一开始以为是mysql版本问题,所以从我自己的5.7.33变成了和公司远端数据库一样的5.7.16版本,错误依旧,所以经过了一系列的查找,终于解决了,现在来整合分享一下我的问题。

错误原因

MySQL5.7版本以上使用group by语句时,会有 this is incompatible with sql_mode=only_full_group_by错误,这是由于mysql5.7以上版本的配置中,默认sql_mode="ONLY_FULL_GROUP_BY",可以通过在查询中写:

select @@GLOBAL.sql_mode;

查询出来的结果是

only_full_group_by

这要求select查找的字段必须包含在group by后面,下面是例子

select a,b from table group by a; (×)

select a,b from table group by a,b,c; (√)

group by的字段可以比select的多,不能比select的少

 

解决办法

1.临时修改

在查询中输入

set @@GLOBAL.sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION;

这种方法在重启mysql服务的时候就会失效

2.永久修改

在mysql的根目录下,找到my.ini文件,如果没有,而有其他名字的ini文件,比如my-default.ini或者mysql.ini,保留!不要删除或替换!不然重启mysql的时候会打不开服务,复制已有的配置文件到当前目录,并改名为my.ini,这样根目录就会有两个配置文件,

MySQL报错:this is incompatible with sql_mode=only_full_group_by_第1张图片

然后把下面这行配置加在[mysqld]栏下

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

下面放一下我的my.ini文件的具体内容

[mysql]

# 设置mysql客户端默认字符集

default-character-set=utf8

[mysqld]

#设置3306端口

port = 3306

# 设置mysql的安装目录

basedir=D:\Tools\MySQL\mysql-5.7.16-winx64

# 设置mysql数据库的数据的存放目录

datadir=D:\Tools\MySQL\mysql-5.7.16-winx64\data

# 允许最大连接数

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

这样子在查询中再次执行

select @@GLOBAL.sql_mode;

就会得到

视mysql版本不同,效果不同

如果其他版本如8.0没有用,就把 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION分别放进[mysql]栏和[mysqld]栏

如果还不行,就只保留 STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION再试

最后,重启mysql服务

 

如有错误,欢迎指正

你可能感兴趣的:(mysql,java)