错误场景
今天在自己电脑运行一个刚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,这样根目录就会有两个配置文件,
![](https://img-blog.csdnimg.cn/20210422171659507.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NDUwNzIw,size_16,color_FFFFFF,t_70)
然后把下面这行配置加在[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;
就会得到
![](https://img-blog.csdnimg.cn/20210422171936668.png)
视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服务
如有错误,欢迎指正