• MySQL5.7版本sql_mode=only_full_group_by问题


    0、问题描述

    下载安装的最新版的mysql5.7.x版本,默认是开启了 only_full_group_by 模式的,但开启这个模式后,执行原先的 group by 语句就报错。

    SELECT * FROM student GROUP BY class;
    
    # 报错,only_full_group_by开启的情况下,只允许返回GROUP BY 涉及的字段
    # 一旦开启 only_full_group_by ,group by 的行为就变得和 distinct 一样了,只能获取受到其影响的字段信息,无法和其他未受其影响的字段共存

    以下是SQL查询的错误提示信息:

    [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

    1、查看sql_mode

    select @@global.sql_mode;

    查询出来的值为:

    ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    2、解决方法

    建议采用Percona的方法:Solve Query Failures Regarding ONLY_FULL_GROUP_BY SQL Mode

    注意:使用SET GLOBAL sql_mode进行设置以后,需要重新建立数据库链接(重启应用程序或者DataGrid工具)才能生效。

    3、后续总结:

    实际上,only_full_group_by 模式确实是开启比较好。
    • 其一,更符合SQL标准,
    • 其二,在 MySQL 中有函数 any_value(field), 允许返回非分组字段的出现(和关闭 only_full_group_by 模式有相同效果)。
    但是考虑到很多已有项目的SQL代码,这个设置方式依然是有实际意义的。
     
    此外,在我的印象里,Spring Data JPA中的JPQL不受此问题影响,可能也和application.yaml中具体的SQL方言设置有关,待后续观察。
  • 相关阅读:
    PLSQL游标
    SqlHelper助手
    机房重构前奏——三层转七层
    应用运筹管理经济
    C++——宏观把控
    操作系统——宏观把控
    .NET总结一
    深复制与浅复制
    设计模式之结构型
    设计模式之一对多
  • 原文地址:https://www.cnblogs.com/echo1937/p/12978367.html
Copyright © 2020-2023  润新知