今天我们来说下 mysql8 关于only_full_group_by的问题,相信每个人在使用group by 函数时会突然跳出一个报错信息:

ERROR 1055 (42000): Expression #7 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'postscan.verifyDelayLog.auditor' which is not functionally dependent on columns in GROUP BY clause; this is incompatible withsql_mode=only_full_group_by

在mysql8.0以上的版本中,对于 group by 的这种聚合操作,如果在select 中的列,没有在group by 中出现,那么这个SQL是不合法的,因为列不在group by的从句中,所以对于设置了这个mode的数据库,在使用group by 的时候,就要用MAX(),SUM(),ANT_VALUE()的这种聚合函数,才能完成GROUP BY 的聚合操作,那么话说回来了,如何关闭呢?

经过我们一番百度之后,获取的结果是关于 only_full_group_by ,但是按照教程所说,只要修改了my.cnf,

在my.cnf添加如下配置

[mysqld]

sql_mode='NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES'

配置文件加入相应参数[以下会讲到],重启的时候,依然差强人意,甚至给出教程的人并没有亲力亲为的去测试,就张贴了出来,还会带来新的mysql的报错,或者是完全启动报错,今天我就来详细与大家一一说明这些参数,及解决办法。

sql_mode这个变量,很容易被忽视,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。

sql_mode常用值如下:

ONLY_FULL_GROUP_BY:对于GROUP BY聚合操作,如果在 SELECT 中的列,没有在 GROUP BY 中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。

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

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

NO_ZERO_IN_DATE:在严格模式下,不允许日期和月份为零

NO_ZERO_DATE:设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

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后,不能用双引号来引用字符串,因为它被解释为识别符

说明介绍完了,但是在8.0中这么设置下依然会报错,原因如下:

ERROR 1231 (42000): Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'

8.0以上已经取消了NO_AUTO_CREATE_USER这个关键字,删掉sql语句中的这个关键字即可

最终,/etc/my.cnf 配置文件中  修改  :sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

重启mysql服务,大功告成!~

在此,我给出另外两种解决方案:

第二种办法不用修改配置文件,使用navicat修改

进入命令行界面

输入: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

然后我们来修改sql_mode

set GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION ';

再运行你的sql,group by就可以使用了,但是这个方法不治本 ,当重启mysql后,依然使用不了group by 所以,第一种方法,是最有效的。

第三种办法不用修改配置文件,使用navicat修改

进入命令行界面

输入:SELECT @@sql_mode; 注意:这边缺省了session,完整的是:SELECT @@SESSION.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

然后我们来修改sql_mode

输入:set SESSION sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ';

再运行你的sql:

*****还是报only_full_group_by错*****

##############解决方法###################

在你查询的语句之前set sql_mode

set SESSION sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ';

以后再新建查询(包含group by)语句也不用再加set sql_mode 直到你关闭这次连接为止

然后你再运行你的sql是不是可以运行啦

SET GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

SELECT @@GLOBAL.sql_mode;

关于办法3的解释:

1.其实讲第三种方法的时候说过SELECT @@sql_mode; 其实这边缺省了session,完整的是:SELECT @@SESSION.sql_mode;

2.SESSION是当前会话的意思---->这句话就解释了直到你关闭这次连接为止

3.那为什么在命令行set sql_mode,然后再新建查询还是没用呢?

4.其实你只要在新建查询中输入SELECT @@sql_mode;你会发现你在命令行中的设置并没有生效

5.所以,我们只能重新在这次连接(会话)的新建查询中重新set sql_mode,之后这次连接(这次会话)不再需要

6.这一段语言解释了“在你查询的语句之前set sql_mode”这句话

对办法2办法3两种方法的说明

1.这两种set sql_mode方法,都会随着在我部署linux上的mysql重启而恢复到我指定的配置文件的my.cnf里面设置的sql-mode选项中的内容

2.这句话比较绕

3.意思就是:linux上的mysql重启后,你在navicat上设置的就不再有效,而是依据你指定的配置文件中的设定,就是my.cnf这个文件中设定

注:现在我将my.cnf列出来,供大家参考

mysql8参数方案_Mysql8.0及以上 only_full_group_by以及其他关于sql_mode原因报错详细解决方案...相关推荐

  1. 关于Unsupported major.minor version 52.0报错问题解决方案

    关于Unsupported major.minor version 52.0报错问题解决方案 参考文章: (1)关于Unsupported major.minor version 52.0报错问题解决 ...

  2. MyEclipse导入jquery-1.8.0.min.js等文件报错的解决方案

    2019独角兽企业重金招聘Python工程师标准>>> MyEclipse导入jquery-1.8.0.min.js等文件报错的解决方案 MyEclipse导入jquery-1.8. ...

  3. 使用前台方式启动Redis时,出现Creating Server TCP listening socket 127.0.0.1:6379: bind: Address already in use报错

    问题描述:使用前台启动方式启动Redis时,出现Creating Server TCP listening socket 127.0.0.1:6379: bind: Address already i ...

  4. 关于Cause: java.lang.ClassNotFoundException: Cannot find class: 0(提示找不到类)报错

    关于Cause: java.lang.ClassNotFoundException: Cannot find class: 0(提示找不到类)报错 搭建mybatis架构过程中idea包出这么一个莫名 ...

  5. 运行报Invalid property 'specParamList[0][specName]' of bean class [com.model.Produ... 报错的解决办法

    运行报Invalid property 'specParamList[0][specName]' of bean class [com.model.Produ... 报错的解决办法 前端需要进行JSO ...

  6. mysql8密码规则_mysql8.0用户密码设置注意事项

    在MySQL 8.0.11中,caching_sha2_password是默认的身份验证插件,而不是以往的mysql_native_password.有关此更改对服务器操作的影响以及服务器与客户端和连 ...

  7. mysql8.0 新特性 sql_mode(mysql 报错1055)

    问题描述 因为开发环境和正式环境所使用的mysql数据库的版本不一样,开发环境使用的时候5.7而正式环境使用的是8.0,而在Mysql的8.0版本中默认是开启sql_mode = only_full_ ...

  8. VS2017+Opencv4.2.0 用HOG+SVM实现INRIA行人检测 报错[ INFO:0] global

    按照网上的代码用svm训练分类器 结果报错 [ INFO:0] global C:\build\master_winpack-build-win64-vc14\opencv\modules\core\ ...

  9. .net Core 6.0 部署到欧拉(Linux)系统上,“The type initializer for ‘Gdip‘ threw an exception” 报错的解决方案

    前言 "The type initializer for 'Gdip' threw an exception" 报错的根本原因, 是因为我们使用了"System.Draw ...

最新文章

  1. 3650服务器性能,全新联想System x3650 M4服务器性能出色
  2. 人体姿态跟踪--Pose Flow: Efficient Online Pose Tracking
  3. python3: print()函数:def,end关键字介绍
  4. 不平衡数据的数据处理方法
  5. 网络监控软件:国产化VS外来者
  6. thymeleaf 异常:SpelEvaluationException: EL1008E: Property or field ‘url‘ cannot be found
  7. how is Customizing activity launched by ABAP Framework
  8. 为什么jsp的form表单不能跳转_手把手教你实现SEM投放监控转化--表单类
  9. JAVA零碎要点015---java BigDecimal常见操作_加减乘除操作_比较_取几位小数四舍五入_随时更新
  10. 个人所得税的申报方式有两种,分别有什么区别?该怎么选?
  11. idea热部署(更新jsp代码不用重编译Tomcat)
  12. 量化开发必掌握的30个知识点【什么是分笔逐笔数据】?
  13. Android JetPack架构篇,一个实战项目带你学懂JetPack
  14. VR全景展示是什么,VR全景展示的功能有哪些?
  15. 连接工作站跑机器学习(Linux命令)
  16. python查找第k大的数_寻找数组中第K大的数
  17. 关于 DWave dimod 使用详解
  18. js 获取字符串长度方法length
  19. linux 修改hosts
  20. NLP-预训练模型-2018-Bert-解析:BertForMaskedLM

热门文章

  1. error LNK2005: void * __cdecl operator new(unsigned int) (??2@YAPAXI@Z) already defined in LIBCMT.
  2. Oracle v$session/v$sql 表
  3. modSecurity规则学习(四)——规则指令编写
  4. String类的常见方法的使用案例
  5. libvlc media player in C# (part 1)
  6. 最简单的Asp.Net 2.0 TreeView的Checkbox级联操作
  7. SQL 2012安装、配置路径
  8. 大数据之-Hadoop_组成---大数据之hadoop工作笔记0013
  9. ES6新特性_let变量声明以及声明特性---JavaScript_ECMAScript_ES6-ES11新特性工作笔记003
  10. Sentinel服务熔断配置exceptionsToIgnore_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0053