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

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

相关推荐
坚定信念,勇往无前3 小时前
mongodb的日志分割
数据库·mongodb
oradh6 小时前
Oracle TX 锁 Mode 4(Share)问题排查总结
数据库·oracle·tx 锁 mode 4·oracle tx 锁
2601_962065256 小时前
[MySQL] SQL优化之性能分析
java·sql·mysql
yi.Ist6 小时前
数据定义语言-DDL操作
数据库·学习·mysql·oracle·大海豚
2601_963282778 小时前
工程项目、政企采购为什么优先选择对讲机批量采购?
数据库
Doraemomo8 小时前
SQLite数据库
数据库·sqlite
云贝教育-郑老师8 小时前
MySQL 的“黑匣子“:Performance Schema 把数据库内部变成一张可查的表
数据库·mysql
这个DBA有点耶10 小时前
同城双活落地的三座山:网络延迟、脑裂预防、反向同步
数据库·架构·dba
青春之我_XP10 小时前
MySQL 常用日期函数 实战指南
数据库·sql·mysql·数据分析·数据库开发·日期函数