项目场景:
项目部署到现场服务器,开发环境没有出现的问题服务器出现mysql1055的问题
问题描述
Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘t0.type’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
原因分析:
大致一看好像没啥问题,但是不然,是由于5.7以上版本默认的 MySQL 配置中 sql_mode 配置了 ONLY_FULL_GROUP_BY,而且默认打开了的,在select 中出现的字段都必须出现在group by 后面(select中聚合函数可以不用)
原本语句:select A.,B from xx group by A 会出现上面的1055错误
5.7版本一下并不会出现这个错误(我的开发环境用的5.6),但是服务器环境用的5.8(出现这个问题)
真正原因就是因为5.7以上版本 开启了ONLY_FULL_GROUP_BY这个 规则用来检验我们的语句的规范,总的 这个规则中,target list中的值来自于聚合函数(sum、avg、max,min等)的结果,或者来源于 group by xx中的表达式的值
解决方案:
方法一:降低mysql版本(太扯了,不能这么做有风险我问题,真实服务环境版本不能随便降)
方法二:关闭only_full_group_by规则
在安装目录下找到 my.ini
在[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'
然后保存文件重启数据库
可以检查一下 SELECT @@GLOBAL.sql_mode;
ONLY_FULL_GROUP_BY 验证规则去掉了
方法三:MySQL提供了any_value()函数—到同一组的数据里第一条数据的指定列值作为返回数据
SELECT A,any_value ( B) AS B ,any_value ( C ) AS C,sum(D) as D FROM XX GROUP BY A
方法四:解决sql的不规范,让语句规范化,如果在 大量语句的情况下选择符合需求的办法,结合逻辑避免问题
其实版本高的应该是修复了许多问题,让sql更加规范,但是也可能会带来一些跨版本的问题,多多注意一下。