MySQL5.7 关闭参数ONLY_FULL_GROUP_BY

ONLY_FULL_GROUP_BY是MySQL提供的一个sql_mode,通过这个sql_mode来提供SQL语句GROUP BY合法性的检查,在MySQL的sql_mode是非ONLY_FULL_GROUP_BY语义时,一条select语句,MySQL允许target list中输出的表达式是除聚集函数或group by column以外的表达式,这个表达式的值可能在经过group by操作后变成undefined

而对于语义限制都比较严谨的多家数据库,如SQLServerOraclePostgreSql都不支持select target list中出现语义不明确的列,这样的语句在这些数据库中是会被报错的,所以从MySQL 5.7版本开始修正了这个语义,就是我们所说的ONLY_FULL_GROUP_BY语义

MySQL对于ONLY_FULL_GROUP_BY语义的判断规则是,如果group by list中的表达式是basic column,那么target list中允许出现表达式是group by listbasic column或者alias column的组合结果,如果group by list中的表达式是复杂表达式(basic column或者alias column),那么要求target list中的表达式必须能够严格和group by list中的表达式进行匹配,否者这条查询会被认为不合法。

默认开启ONLY_FULL_GROUP_BY状态

运行SELECT @@GLOBAL.sql_mode;SELECT @@SESSION.sql_mode;查看sql_model参数,可以看到参数中有ONLY_FULL_GROUP_BY

MySQL5.7 关闭参数ONLY_FULL_GROUP_BY_第1张图片

有时候测试环境会因为这个规则造成一些开发上的干扰,需要关闭

临时关闭方法:(命令行)

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

彻底关闭方法:(修改配置文件)

在my.cnf里面的 [mysqld]下添加

SET sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE

然后重启MySQL。

再查看ONLY_FULL_GROUP_BY已经不见了:

你可能感兴趣的:(数据库)