当前位置:首页 > 数据库 > MySQL数据库5.7解决group by 的问题。

MySQL数据库5.7解决group by 的问题。

2022年11月06日 22:15:18数据库11

项目中本来使用的是mysql5.6进行开发,切换到5.7之后,突然发现原来的一些sql运行都报错,错误编码1055,错误信息和sql_mode中的“only_full_group_by“有关,到网上看了原因,说是mysql5.7中only_full_group_by这个模式是默认开启的。

解决办法大致有两种:

一:在sql查询语句中不需要group by的字段上使用any_value()函数,或其他函数;

当然,这种对于已经开发了不少功能的项目不太合适,毕竟要把原来的sql都给修改一遍

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

如果没有sql_mode这一配置项,打开mysql命令行,执行命令

1

select @@GLOBAL.sql_mode

select @@SESSION.sql_mode

查出sql_mode的值,复制这个值,在my.cnf中添加配置项(把查询到的值删掉only_full_group_by这个选项,其他的都复制过去):

2

sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

如果 [mysqld] 这行被注释掉的话记得要打开注释。然后重启mysql服务

注:使用命令

3

set  SESSION  sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

这样可以修改一个会话中的配置项,在其他会话中是不生效的。

4

set  GLOBAL  sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIO4

这样可以修改整个工作环境的配置。

附加几种常见的sql_mode值的介绍:

几种常见的mode介绍

ONLY_FULL_GROUP_BY:出现在select语句、HAVING条件和ORDER BY语句中的列,必须是GROUP BY的列或者依赖于GROUP BY列的函数列。

NO_AUTO_VALUE_ON_ZERO:该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。

STRICT_TRANS_TABLES:在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制

NO_ZERO_IN_DATE:这个模式影响了是否允许日期中的月份和日包含0。如果开启此模式,2016-01-00是不允许的,但是0000-02-01是允许的。它实际的行为受到 strict mode是否开启的影响1。

NO_ZERO_DATE:设置该值,mysql数据库不允许插入零日期。它实际的行为受到 strictmode是否开启的影响2。

ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如果未给出该模式,那么数据被零除时MySQL返回NULL

NO_AUTO_CREATE_USER:禁止GRANT创建密码为空的用户

NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

PIPES_AS_CONCAT:将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

ANSI_QUOTES:启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符

 

 

作者:老猫*
来源链接:https://blog.csdn.net/YouAreMy_Sunshine/article/details/81562423

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/database/68249.html

标签: group byMySQL
分享给朋友:

“MySQL数据库5.7解决group by 的问题。” 的相关文章

MySQL触发器

MySQL触发器 触发器是一种特殊的存储过程,触发器和存储过程一样是一个能完成特定功能、存储在数据库服务器上的SQL片段,但是触发器无需调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行,无需手动调用. 在MySQL中,只...

性能优化|深入理解mysql索引数据结构与算法

性能优化|深入理解mysql索引数据结构与算法

什么是索引? 在mysql中,索引就是帮助mysql快速找到某条数据的一种数据结构,它是排好序的,独立于mysql表数据之外的。 索引数据结构分为哪几种 二叉树、红黑树、Hash表、B树。 在这里我们主要介绍hash表和B树...

MySQL学习(4)︱数据库的查询

MySQL学习(4)︱数据库的查询

在SQL中,使用select语句来查询数据。不同的关系数据库,select语法会有细微差别,在MySQL官网可以查询到支持的select语法。 SQL语法: SELECT column_name1, column_name2//...

MYSQL查询某字段为空的数据

where  XXX is NULL!! 没错就是这样     拓展:查询某字段不为空的数据 where  XXX != '' 作者:Idiot_2018 来源链接:https://...

mysql的查询句

1、查询特定列:select 列名 from 表名;(必须先进入数据库)或者 select 列名 from 数据库.表名; 2、查询多个列:select 列1,列2,。。。 from 表名; 3、除去重复列查询:select distinct 列名 fr...

MySQL查询某个字段不重复的所有记录

MySQL查询某个字段不重复的所有记录

select a.id,a.ip,a.creationTime from myTable a right join ( select max(id) id from myTable group by ip) b on b.id = a.id where a.id is not n...

MySQL查询某个时间段内的字段,使用的日期是String类型,但数据库中是时间戳

MySQL查询某个时间段内的字段,使用的日期是String类型 在Java中,想要实现对数据库中的特殊查询——查询某个时间段内的字段,但是传入的日期值是String型,而数据库中的日期是时间戳…… 可以使用如下方法: 比如: ’ 2019-0...

mysql 查询列拼接字段

mysql 拼接字符函数 concat 转自:https://blog.csdn.net/q718330882/article/details/37690677 mysql 的concat函数可以实现数据库中字段的自由拼接 并且保存成临时字段 mysql>...

MYSQL查询大于某个时间的数据

今天: SELECT * FROM 表名 WHERE TO_DAYS( 时间字段名) = TO_DAYS(NOW()); 昨天: SELECT * FROM...

mysql查询前几条记录

原文地址为: mysql查询前几条记录 SELECT   *   FROM   table   LIMIT   5;  &n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。