mysql8.0 sql_mode与ONLY_FULL_GROUP_BY报错

如果你的项目出现如下类似的错误

Error querying database. Cause: java.sql.SQLSyntaxErrorException: 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 ### The error may exist in class path resource [xml文件路径] ### The error may involve 查询方法名 ### The error occurred while setting parameters

大概率是因为你的程序是在mysql5.7以下版本开发的,但是迁移到了更高版本的mysql运行,更高版本的mysql在分组时会要求分组的字段必须位于select 所查询的字段列表中,此时你有两种选择:

1.更改你的查询语句.

2.更改数据库的查询限制策略.

以Windows版本的mysql8.0为例,我们通过以下查询语句可以查询mysql的当前限制策略:

bash 复制代码
SELECT @@GLOBAL.sql_mode;

可以看到返回值是

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

通过sql的方式替换掉ONLY_FULL_GROUP_BY字段并不见效

网络上大部分的建议是更改sql_mode,以下是示例

首先,找到mysql8.0 my.ini默认的配置文件路径,Windows在

C:\ProgramData\MySQL\MySQL Server 8.0\ 目录下,然后修改为如下配置

bash 复制代码
[mysqld]  
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

对于有些版本,重启后再次查询,发现ONLY_FULL_GROUP_BY限制已经去除,但有些版本还是无效的,原因在于,在一些新版本的Mysql里,数据库的限制策略关键字已经不叫sql_mode,而叫

sql-mode

此时,查看配置文件的大约120行左右,你会看到:

bash 复制代码
sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

问题就出在这里,把上面配置里的ONLY_FULL_GROUP_BY连同后面的逗号去掉就可以了.

重启mysql,故障解决.

如果快速帮你定位并解决到了问题,记得点赞收藏哦.

相关推荐
ANGLAL10 分钟前
17.MyBatis动态SQL语法整理
java·sql·mybatis
懒羊羊不懒@12 分钟前
【MySQL | 基础】通用语法及SQL分类
数据库·oracle
llxxyy卢18 分钟前
基于时间的 SQL 盲注-延时判断和基于布尔的 SQL 盲注
数据库·sql·oracle
Yeats_Liao1 小时前
时序数据库系列(六):物联网监控系统实战
数据库·后端·物联网·时序数据库
珊珊而川1 小时前
MAC-SQL:黄金标准错误
数据库·sql
一 乐2 小时前
智慧党建|党务学习|基于SprinBoot+vue的智慧党建学习平台(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·学习
lcanfly4 小时前
Mysql作业4
数据库·mysql
喜欢踢足球的老罗5 小时前
认证与授权:详解大型系统中用户中心与RBAC的共生关系
数据库·rbac
zhaomx19895 小时前
Spring 事务管理 Transaction rolled back because it has been marked as rollback-only
数据库·spring