Java家技术论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java家技术论坛(http://www.javajia.net)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JavaEE 49期就业班视频教程2019最新 JavaEE 57期 入门到项目实战

最新微服务架构实战160讲教程

Go语言视频零基础入门到精通

Java从菜鸟到大神的学习路线之实战篇

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
查看: 795|回复: 0

[默认分类] mysql5.7.X版本only_full_group_by问题解决

[复制链接]
  • TA的每日心情
    开心
    6 天前
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2020-8-17 10:46:46 | 显示全部楼层 |阅读模式
    一、出错原因
    最近因为开发数据库与部署数据库版本不同,带来了几个问题,其中only_full_group_by问题是之前没有遇到的。
         具体报错如下

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


    可以看出是因为sql_mode中设置了only_full_group_by模式引起的,
    sql_mode的作用是什么呢?

    1. 模式定义mysql会支持哪些sql语法。以及应执行哪种数据验证检查。最终达到的目标:适应在不同环境中适应mysql,因为可
    2. 以根据各自的程序设置不同的操作模式。
    复制代码


      
    在only_full_group_by这种模式下,使用group by语句进行查询时,所要查询的语句必须依赖于group by子句中所列出的列,也就是group by要以查询的字段
    作为分组依据,这里是要查询的所有字段。
    另外常用的sql_mode有:

    1. ONLY_FULL_GROUP_BY:
    2. 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
    3. NO_AUTO_VALUE_ON_ZERO:
    4. 该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。
    5. STRICT_TRANS_TABLES:
    6. 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制
    7. NO_ZERO_IN_DATE:
    8. 在严格模式下,不允许日期和月份为零
    9. NO_ZERO_DATE:
    10. 设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。
    11. ERROR_FOR_DIVISION_BY_ZERO:
    12. 在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL
    13. NO_AUTO_CREATE_USER:
    14. 禁止GRANT创建密码为空的用户
    15. NO_ENGINE_SUBSTITUTION:
    16. 如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
    17. PIPES_AS_CONCAT:
    18. 将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似
    19. ANSI_QUOTES:
    20. 启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符
    复制代码


    我们可以使用

    1. select @@global.sql_mode; //全局配置
    复制代码


    查询
    也可以通过

    1. select @@sql_mode;//已存在数据库配置
    复制代码


    查询
    二、解决方法
    1.使用any_value()函数,这个函数对不需要group by的字段有效,等同于关闭only_full_group_by,但是这样难免会遗漏某个字段,所以不推荐使用。
    2.暂时性关闭(可以通过select @@sql_mode查出sql_mode以后去掉ONLY_FULL_GROUP_BY后复制过来

    1. set sql_mode=" " //改变已经存在的数据库sql_mode
    复制代码



    1. set @@global.sql_mode=" " //改变全局配置sql_mode
    复制代码


    以上配置在重启服务以后失效
    3.更改配置文件(推荐使用)
    linux系统更改/etc/my.cnf文件,使用vi命令打开,如果有sql_mode=...的注释就把注释打开,如果没有就加上sql_mode=...(可以通过select @@sql_mode查出sql_mode以后去掉ONLY_FULL_GROUP_BY后复制过来
    windows下配置文件是安装目录下的my.ini文件,其余同上
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    .

    Java家技术论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2020-10-25 21:11 , Processed in 0.081916 second(s), 27 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表