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,故障解决.

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

相关推荐
e***98571 分钟前
Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)
数据库·redis·缓存
xingyue_S1 分钟前
MySQL 数据库(一) -- 初体验
数据库·mysql·oracle
X***C8627 分钟前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
爬山算法8 分钟前
Redis(156)Redis的延迟问题如何解决?
数据库·redis·缓存
v***91308 分钟前
Windows版Redis本地后台启动
数据库·windows·redis
x***44019 分钟前
【prometheus】监控MySQL并实现可视化
数据库·mysql·prometheus
h***04779 分钟前
MySQL 的 INSERT(插入数据)详解
android·数据库·mysql
梁bk10 分钟前
Redis 数据类型(上)String,List,Set
数据库·redis
u***276117 分钟前
【MySQL】数据库和表的操作
数据库·mysql·oracle
g***557523 分钟前
【MySQL基础篇】概述及SQL指令:DDL及DML
sql·mysql·oracle