升级MySQL 5.7后的一个隐藏坑

2,780次阅读

共计 1166 个字符,预计需要花费 3 分钟才能阅读完成。

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

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

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

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

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

属于正常执行的:

$sql_7days = $db->select('COUNT(author) AS cnt','author','url','mail')
        ->from('table.comments')
        ->where('status = ?', 'approved')
        ->where('created > ?', $period)
        ->where('type = ?', 'comment')
        ->where('authorId = ?', '0')
        ->where('mail != ?', $options->socialemail)   // 排除自己上墙
        ->group('author')
        ->order('cnt', Typecho_Db::SORT_DESC)
        ->limit('51');    // 读取几位用户的信息

但为何会出现错误呢?搜索了下才知道是因为 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:

show variables like "sql_mode";

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

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

sql_mode = xxxx

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

正文完
 
Blood.Cold
版权声明:本站原创文章,由 Blood.Cold 2019-05-06发表,共计1166字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。