解决服务器(本地)mysql数据库报 this is incompatible with sql_mode=only_full_group_by错误
解决控制台或服务器报数据库(本地)报错: this is incompatible with sql_mode=only_full_group_by] with root cause
服务器
昨天项目试着部署上云,然后修改了一下数据库,却不知道怎么回事,报了一堆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中,但这会导致我们所查找的数据产生变异,得不到想要的。
长路漫漫,让我们继续加油,充实自己。
更多推荐
所有评论(0)