昨天在数据迁移的过程中,后台接口函数无法链,因为要模拟本地局域网,不能使用外网,所以web环境都是本地U盘下载的安装包,所有环境安装完成后运行项目发现后台无法查看数据,SQL语句会报错:“1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated”,之前遇到过类似的错误,但是没有去记录,导致问题再现时又是度娘结局额的,所以长个记性记录下,但其实它的原因并不复杂。
这个错误的产生,主要是因为在MySQL数据库版本为5.7及以上时,默认开启了ONLY_FULL_GROUP_BY SQL模式。在这个模式下,对于GROUP BY操作有严格的要求:SELECT语句中的查询列,如果不在GROUP BY子句中出现,那么这个查询就是非法的。这是因为,非聚合列在GROUP BY操作中没有明确的值,所以MySQL无法确定如何对这些列进行分组。
为了解决这个问题,我们可以采取以下两种方法:
在MySQL的配置文件中进行设置。对于Linux系统,我们需要编辑【/etc/my.cnf】文件,在[mysqld]配置中添加或修改sql_mode字段。
对于Windows系统,我们需要编辑MySQL安装目录下的【my.ini】文件,同样在[mysqld]配置中添加或修改sql_mode字段。
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
在添加或修改完sql_mode字段后,如图:
我们需要保存文件并重启MySQL服务,以使设置生效。
在Navicat中,输入下列SQL语句进行查询:
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
通过上面的查询结果,可以看到 开启了 ONLY_FULL_GROUP_BY 模式,这里第一种解决方案就是,去除 ONLY_FULL_GROUP_BY,重新设置值。
命令如下:
set @@global.sql_mode
='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
执行完上面的SQL语句之后,再次执行报错的SQL语句,发现可以正常运行了。
另外树下,修改之后一定一定需要重启mysql才能使其生效。好了,修改完成项目运行一切正常,有问题留言反馈,对于不属于sql域名的直接在文件里添加然后重启mysql就行,不然出错就不好弄了,还要记得备份啊!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。