升级MySQL 5.7后的一个隐藏坑

  • 升级MySQL 5.7后的一个隐藏坑已关闭评论
  • 18 views
  • A+
所属分类:编码

MySQL版本升级了一下,以前用的是MySQL 5.5,现在升级到了MySQL 5.7。

本想着版本升级以后应该会很好用,当然之前也一直没察觉出来什么不好用的地方,直到今天……

突然想看看留言排行,然后就发现竟然出现错误了,打不开了!

看了下是SQL错误,提示:mysql column which is not functionally dependent GROUP BY clause

看了下是group by的问题,于是看了下SQL语句,没什么问题啊!

属于正常执行的:

但为何会出现错误呢?搜索了下才知道是因为MySQL 5.7开始,在sql_mode中有一项配置叫做ONLY_FULL_GROUP_BY,属于MySQL 5.7的新产物,通过这个sql_mode来提供SQL语句GROUP BY合法性的检查。

在之前,MySQL是允许target list中输出的表达式是除聚集函数或group by column以外的表达式,这个表达式的值可能在经过group by操作后变成undefined。

而其他如SQLServer、Oracle、PostgreSql等数据库都不支持select target list中出现语义不明确的列,出现就会报错,所以在MySQL 5.7中对这一语义问题进行了修复。

既然这样,那就是说咱们就必须要对group by语句进行严格的检查才可以执行咯,可是若之前是5.7以前的数据库语句,难道都要通过升级SQL语句才可以?难道不能兼容下?

于是,再查了下资料,发现其实可以把ONLY_FULL_GROUP_BY去除,这样就能兼容5.7之前的group by语句了。

首先登陆mysql,并查询当前的sql_mode:

会显示出当前所使用的sql_mode列表

把内容复制出来,然后打开my.cnf文件,在[mysqld]下面添加一行:

其中xxx就是刚才复制出来的内容,只要把其中的ONLY_FULL_GROUP_BY去掉就行了。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin