升级到mysql8.0后部分SQL语句出现group by不兼容问题
Posted 架构学习圈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了升级到mysql8.0后部分SQL语句出现group by不兼容问题相关的知识,希望对你有一定的参考价值。
在项目迁移过程中,将mysql数据库从版本5.6升级到8.0,部分查询语句出现异常,提示信息如:
/* SQL错误(1055):Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ct.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by */
意思是GROUP BY子句不兼容sql_mode的only_full_group_by 模式。
在ONLY_FULL_GROUP_BY模式下,target list中的值要么是来自于聚集函数的结果,要么是来自于group by list中的表达式的值。
### 查看sql_mode
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_mode,值为上一步的结果(去掉ONLY_FULL_GROUP_BY,即关闭only_full_group_by模式)。
my.cnf 或者 my.ini
在 [mysqld] 下面增加
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
```//测试环境配置如下
[Client]
port = 3306
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=E:\mysql-8.0.22-winx64
# 设置mysql数据库的数据的存放目录
datadir=E:\mysql-8.0.22-winx64\data
# 允许最大连接数
max_connections=1000
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 去掉only_full_group_by,待修正group by后改回
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
```
### 重启mysql服务
重启mysql8服务后,问题解决。后续需要修改相关兼容问题的SQL语句,再改回原先的设置。
以上是关于升级到mysql8.0后部分SQL语句出现group by不兼容问题的主要内容,如果未能解决你的问题,请参考以下文章