龙空技术网

MySQL错误-this is incompatible with sql_mode=only_full_group_by

思考与人生同在 106

前言:

此时我们对“mysql发生系统错误2”可能比较关切,兄弟们都需要学习一些“mysql发生系统错误2”的相关知识。那么小编也在网摘上网罗了一些关于“mysql发生系统错误2””的相关内容,希望各位老铁们能喜欢,各位老铁们快快来学习一下吧!

一、问题

当我们在使用mysql中的group by命令时,有时候会出现

this is incompatible with sql_mode=only_full_group_by

二、错误分析

1.从原理层面分析

这个错误发生在mysql 5.7 版本及以上版本会出现的问题:mysql 5.7版本默认的sql配置是:sql_mode="ONLY_FULL_GROUP_BY",这个配置严格执行了"SQL92标准"。很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。

2.从sql层面分析

在sql执行时,出现该原因:就是输出的结果是叫target list,就是select后面跟着的字段;还有一个地方group by column,就是 group by后面跟着的字段。由于开启ONLY_FULL_GROUP_BY的设置,所以如果一个字段没有在target list 和group by字段中同时出现,或者是聚合函数的值的话,那么这条sql查询是被mysql认为非法的,会报错误

查看sql_mode的语句:

mysql> SHOW SESSION VARIABLES;mysql> SHOW GLOBAL VARIABLES;mysql> select @@sql_mode;

可见session和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

官网ONLY_FULL_GROUP_BY 说明:

Reject queries for which the select list, HAVING condition, or ORDER BY list refer to nonaggregated columns that are neither named in the GROUP BY clause nor are functionally dependent on (uniquely determined by) GROUP BY columns.

如果查询的选择列表、HAVING条件或ORDER BY列表引用的非聚合列既不在GROUP BY子句中命名,也不在功能上依赖于GROUP BY列(由GROUP BY列唯一确定),则拒绝这些查询。

As of MySQL 5.7.5, the default SQL mode includes ONLY_FULL_GROUP_BY. (Before 5.7.5, MySQL does not detect functional dependency and ONLY_FULL_GROUP_BY is not enabled by default. For a description of pre-5.7.5 behavior, see the MySQL 5.6 Reference Manual.)

从MySQL 5.7.5开始,默认的SQL模式包括ONLY_FULL_GROUP _BY。(在5.7.5之前,MySQL不检测功能依赖,默认情况下ONLY_FULL_GROUP_BY未启用。有关5.7.5之前行为的描述,请参阅MySQL 5.6参考手册。)

A MySQL extension to standard SQL permits references in the HAVING clause to aliased expressions in the select list. Before MySQL 5.7.5, enabling ONLY_FULL_GROUP_BY disables this extension, thus requiring the HAVING clause to be written using unaliased expressions. As of MySQL 5.7.5, this restriction is lifted so that the HAVING clause can refer to aliases regardless of whether ONLY_FULL_GROUP_BY is enabled.

标准SQL的MySQL扩展允许在HAVING子句中引用选择列表中的别名表达式。在MySQL 5.7.5之前,启用ONLY_FULL_GROUP_BY会禁用此扩展,因此需要使用无别名表达式编写HAVING子句。从MySQL 5.7.5起,取消了此限制,以便HAVING子句可以引用别名,而不管是否启用了ONLY_FULL_GROUP _BY。

三、解决方案

3.1 方案一

sql语句暂时性修改sql_mode,语句如下:

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'

或者

mysql> 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';mysql> 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';

使用上面的语句修改,会出现一定的问题:

就是在重启mysql数据库服务之后,ONLY_FULL_GROUP_BY还会出现

3.2 方案二

永久解决方案:

需修改mysql配置文件,通过手动添加sql_mode的方式强制指定不需要ONLY_FULL_GROUP_BY属性, my.cnf位于etc文件夹下,vim下光标移到最后,语句添加如下:

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_mode=""

重启mysql服务,顺利解决

3.3 当使用云数据库时,解决方法找到数据库管理,参数设置,修改参数sql_mode中的数据,把ONLY_FULL_GROUP_BY去掉

原文链接:

标签: #mysql发生系统错误2