服务器

昨天项目试着部署上云,然后修改了一下数据库,却不知道怎么回事,报了一堆500,主要原因还是
this is incompatible with sql_mode=only_full_group_by
因为这个错误并发了许多500。
这个是控制台打印出来的产物

Expression #1 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] with root cause

经过借鉴许多前辈们的解决方法,发现还是要靠自己聪明的大脑。
直接修改配置文件,简单粗暴,永久修改。

解决问题

我的服务器是ubuntu的,在/etc/mysql/my.cnf里面进行了修改,在[mysqld]下面输入,如果没有[mysqld],那就在最下面写上[mysqld]。


sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'

有的服务器是在my.ini文件中配置,可以多多尝试,是程序员就不要怕报错。
在[mysqld]下也可以配置

collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

然后重启一下数据库

service mysql restart

最后发现bug解决了。
如果重启后不能解决问题,可以尝试在/etc/mysql/mysql.cnf和/etc/mysql/conf.d/mysql.cnf中配置以上配置。

本地

在Navicat上查询 @@GLOBAL.sql_mode;

select @.sql_mode;

看一下有没有结果里有没有only_full_group_by,如果有的话,那就需要把它去掉。

方案一:修改配置文件,永久修改。
在C:\Program Files\MySQL\MySQL Server 8.0找到my.ini文件,如果找不到那就在C:\ProgramData\MySQL\MySQL Server 8.0文件夹下找my.ini。mysql根据版本的不同,my.ini文件会默认在不同的文件夹下。
在【mysqld】下添加:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

切记:不要修改sql-mode,这俩个不一样。虽然说和sql_mode的值一样,里面有only_full_group_by,但不相干。
在这里插入图片描述
如何重启一下mysql的服务:
win+r,services.msc,找到服务重启一下。

方案二:用于语句修改(不建议,不永久)
在Navicat中查询中输入:

SET @.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SET sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

俩个语句虽然解决报错,但是暂时的,重启后就会失效。
如果在本地端实在找不到my.ini配置文件,那就重新安装数据库把,毕竟解决这个问题的时间远远大于重新安装时间。。。

总结

来分析一下原因,是怎么导致的。
如果group up 给去掉会发现sql语句正常运行,但加上后,却报错。还真是奇怪,通过一番查找,原来是mysql的版本自从5.7后就默认开启sql_mode模式,只要在select中出现的字段,除了聚合函数外,其他的字段都要出现在group up中,但这会导致我们所查找的数据产生变异,得不到想要的。

长路漫漫,让我们继续加油,充实自己。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐