vlambda博客
学习文章列表

升级到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语句,再改回原先的设置。