Mysql8报错this is incompatible with sql_mode=only_full_group_by问题
作者:XL's妃妃
一、报错问题
1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column '字段名'
which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
大致意思:
SELECT列表的表达式#2不在GROUP BY子句中,并且包含非聚合列的jsfwpt.o。
它在功能上不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by不兼容
二、导致的原因
1、如果mysql是高版本,当执行group by时,select的字段不属于group by的字段的话,sql语句就会报错
2、这个错误发生在mysql 5.7.5 版本及以上版本会出现的问题:mysql 5.7.5版本以上默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了"SQL92标准"。很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。
3、在sql执行时,出现该原因,简单来说就是:由于开启了ONLY_FULL_GROUP_BY的设置,如果select 的字段不在 group by 中,并且select 的字段未使用聚合函数(SUM,AVG,MAX,MIN等)的话,那么这条sql查询是被mysql认为非法的,会报错误…
三、检查是否是此原因
1、查看sql_mode
select @@GLOBAL.sql_mode;
2、执行结果:sql_mode开启了only_full_group_by 属性
四、解决办法
方法1、使用函数ANY_VALUE()
使用ANY_VALUE(<字段名>)将报错的字段包裹起来
- MySQL有any_value(field)函数,它主要的作用就是抑制ONLY_FULL_GROUP_BY值被拒绝。
- 这样sql语句不管是在ONLY_FULL_GROUP_BY模式关闭状态还是在开启模式都可以正常执行,不被mysql拒绝。
方法2、临时修改sql_mode
方法2:仅用于临时去掉ONLY_FULL_GROUP_BY,重新设置值,重启mysql之后此方法就会失效
在已创建的数据库中执行:
SET sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
修改mysql全局的sql_mode执行:
SET @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
方法3、永久修改sql_mode
通过修改mysql配置文件my.ini解决
windows系统MySQL8永久修改sql_mode的方式
1、在MySQL安装的目录所在的分区根目录下,“查看“——勾选显示“隐藏的项目”,
2、my.ini的路径:ProgramData\MySQL\MySQL Server 8.0
3、打开my.ini文件
在[mysqld]下面找sql-mode,修改为如下内容:(没有sql-mode就追加在[mysqld]下面)
sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
4、重启mysql
liunx上的修改方式
1、文件路径一般在:/etc/my.cnf,/etc/mysql/my.cnf
2、my.ini的具体修改方法略:与windows上一样
五、验证
sql_mode已经没有only_full_group_by 属性了
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。