在Ubuntu/Linux环境下使用MySQL:修改数据库sql_mode,可解决“this is incompatible with sql_mode=only_full_group_by”问题

操作系统:Ubuntu 18.04 64位

MySQL版本:MySQL 5.7

一、问题描述

在本次发现的这个问题中,其原因是业务系统在对某张数据库表进行查询的时候,对查询结果做了group by操作,并且根据业务数据的记录创建时间进行了排序。

在执行查询的时候,MySQL就会抛出一条错误:

this is incompatible with sql_mode=only_full_group_by

由于在大部分业务系统中,对记录的创建时间排序是非常常见的操作方式,但是很少会将记录的创建时间放入group by子句中,这样group by就失去了意义。所以我们不能选择修改SQL查询语句来解决这一问题。

二、问题原因

引发这一问题的原因非常简单,由于在MySQL5.7及以上版本,默认在数据库服务的sql_mode设置中,增加了以下配置:

ONLY_FULL_GROUP_BY

就是这一设置导致了问题的发生。在MySQL5.7及以上版本中,当数据库安装完成后,sql_mode的这一设置就默认生效了。我们可以通过以下差需语句来确认自己当前数据库中的sql_mode配置:

select @@GLOBAL.sql_mode;

查询的结果如下所示,这是已经完成了修改后的配置,其中已经看不到ONL_FULL_GROUP_BY的配置项了。:

三、解决办法

3.1修改my.cnf配置文件

在Linux环境下,my.cnf配置文件位于系统etc目录下:

在上图的示例中,“my.cnf“被指向了位于目录“/etc/alternatives”下的同名文件,因此我们需要转到该目录下,并打开该文件:

然后在文件的末尾,输入以下内容:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

如下图所示:

最后,重新启动MySQL服务即可。

传送门:在Ubuntu/Linux环境下使用MySQL:启动和关闭MySQL服务

注意:在修改my.cnf文件前,请将它妥善备份。如果修改完毕后,无法正常启动MySQL服务,请恢复该文件后重新尝试。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章