如果你的项目出现如下类似的错误
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,故障解决.
如果快速帮你定位并解决到了问题,记得点赞收藏哦.