MySQL5.7.x版本关于only_full_group_by报错的解决方案

编辑
  • 文档创建者:zsh331
  • 浏览次数:5666次
  • 编辑次数:4次
  • 最近更新:Kevin-s 于 2019-06-02
  • 一、问题描述

    有些项目初期是在 MySQL5.6(以上)进行开发,后期由于某种原因升级到 MySQL5.7 之后,可能就会突然发现原来的一些 SQL 运行都报错。

    例如:错误代码:1301 数据集配置错误 Query:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column


    二、问题分析

    从上面的错误代码我们不难看出,应该是和 SQL 的 group by 语法有关。经过查阅 5.7 的资料证实:由于 sql_mode的only_full_group_by 模式是默认(开启)的,以前能正常运行的一些语法(不规范)不再被兼容导致的报错,必须严格按照sql语法书写。


    三、解决方案

    3.1 在 SQL 查询语句中不需要 group by 的字段上使用 any_value() 函数。但是,这种处理方法对于已经开发完成的项目好像不太现实,因为可能设置到的修改语句实在太多(不推荐)

    注: any_value(field) 函数允许非分组字段的出现(和关闭 only_full_group_by 模式有相同效果)


    3.2 在 SQL 查询语句前添加 SET GLOBAL sql_mode = ''; 把 sql_mode的only_full_group_by 模式关闭


    3.3 修改 my.cnf(windows下是my.ini)配置文件,删掉 only_full_group_by 这一项。


    3.4 如果在 my.ini 中找不到 only_full_group_by 项,我们可以打开 MySQL 命令行,执行命令:select @@sql_mode 得到 sql_mode 的值,将其添加到 my.cnf 文件的配置项里面(务必删掉 only_full_group_by 这个选项,其他的都复制过去)

    内容大概:sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION


    注:关于 SQL_MODE 变量,5.6 以前的版本默认为空,MySQL 5.6 中默认是严格模式,在最新的 MySQL 5.7 中对它进行的可选项设置。SQL_MODE 的默认设置其实是比较冒险的一种设置,因为在这种设置下可以允许一些非法操作。


    3.5 重启 MySQL 服务。

    附件列表


    主题: 数据连接
    标签: 暂无标签 编辑/添加标签
    如果您认为本文档还有待完善,请编辑

    文档内容仅供参考,如果你需要获取更多帮助,付费/准付费客户请咨询帆软技术支持
    关于技术问题,您还可以前往帆软社区,点击顶部搜索框旁边的提问按钮
    若您还有其他非技术类问题,可以联系帆软传说哥(qq:1745114201

    此页面有帮助吗?只是浏览 [ 去社区提问 ]