Mysql5.7及以上版本 ONLY_FULL_GROUP_BY报错的解决方法

 更新时间:2020年03月26日 11:02:43   作者:赵小胖0914  
这篇文章主要介绍了Mysql5.7及以上版本 ONLY_FULL_GROUP_BY报错的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

近期在开发过程中,因为项目开发环境连接的mysql数据库是阿里云的数据库,而阿里云的数据库版本是5.6的。而测试环境的mysql是自己安装的5.7。因此在开发过程中有小伙伴不注意写了有关group by的sql语句。在开发环境中运行是正常的,而到了测试环境中就发现了异常。

原因分析:MySQL5.7版本默认设置了 mysql sql_mode = only_full_group_by 属性,导致报错。

其中ONLY_FULL_GROUP_BY就是造成这个错误的罪魁祸首了,对于group by聚合操作,如果在select中的列没有在group by中出现,那么这个SQL是不合法的,因为列不在group by从句中,所以设置了sql_mode=only_full_group_by的数据库,在使用group by时就会报错。

测试环境下载安装的是最新版的mysql5.7.x版本,默认是开启了 only_full_group_by 模式的,但开启这个模式后,原先的 group by 语句就报错,然后又把它移除了。

一旦开启 only_full_group_by ,感觉,group by 将变成和 distinct 一样,只能获取受到其影响的字段信息,无法和其他未受其影响的字段共存,这样,group by 的功能将变得十分狭窄了

only_full_group_by 模式开启比较好。因为在 mysql 中有一个函数: any_value(field) 允许,非分组字段的出现(和关闭 only_full_group_by 模式有相同效果)。

1、查看sql_mode

SELECT @@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

2、去掉ONLY_FULL_GROUP_BY,重新设置值。

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

3、上面是改变了全局sql_mode,对于新建的数据库有效。对于已存在的数据库,则需要在对应的数据下执行

SET 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数据库重启后依然无效,下列方式重启后依然生效

找到MySQL的配置文件,在linux系统上/etc/my.cnf文件,查询sql_mode字段,我并没有在配置文件中找到这个关键字,所以我手动添加进去:

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

需要注意的一点是一定要添加在[mysqld]配置内,这样添加完后重启mysql才会生效,退出数据库:exit,重启命令:

service mysqld restart

刷新页面报错信息消失成功解决,再次连接上数据库查看sql_mode配置select @@sql_mode:

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

到此这篇关于Mysql5.7及以上版本 ONLY_FULL_GROUP_BY报错的解决方法的文章就介绍到这了,更多相关Mysql5.7 ONLY_FULL_GROUP_BY内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • MySQL中使用CTE获取时间段数据的技巧分享

    MySQL中使用CTE获取时间段数据的技巧分享

    在数据库操作中,获取特定时间段的数据是一项常见任务,MySQL自从8.0版本开始支持CTE(公共表表达式),使得我们可以更加灵活和高效地处理时间段数据,本文小编介绍了MySQL中使用CTE获取时间段数据的技巧分享,需要的朋友可以参考下
    2024-08-08
  • MySQL远程访问设置终极方法

    MySQL远程访问设置终极方法

    这篇文章主要介绍了MySQL远程访问设置终极方法,本文总结了多种设置方法和技巧,是解决远程访问的终极解决方案,需要的朋友可以参考下
    2014-12-12
  • MYSQL如何 查询数据库中所有表中的数据量

    MYSQL如何 查询数据库中所有表中的数据量

    INFORMATION_SCHEMA.TABLES 是 MySQL 中的系统表,用于存储关于数据库中的表的信息,这篇文章主要介绍了MYSQL如何 查询数据库中所有表中的数据量,需要的朋友可以参考下
    2024-01-01
  • 一文详解MySQL8.0的索引新特性

    一文详解MySQL8.0的索引新特性

    MySQL中的索引可以为提高我们的查询效率,相比较于低版本, MySQL 8.0中针对索引做了不少的优化,本文主要给大家分享一些MySQL8.0索引的新特性,希望大家可以在日常的开发中根据实际场景用起来
    2023-07-07
  • 关于mysql delete的问题小结

    关于mysql delete的问题小结

    关于mysql delete的问题,需要的朋友可以参考下。
    2011-05-05
  • mysql获取版本的几种方法实现

    mysql获取版本的几种方法实现

    本文主要介绍了mysql获取版本的方法实现,主要介绍了三种方法,包含SELECT VERSION(),SHOW VARIABLES和命令行,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • 详细聊一聊mysql的树形结构存储以及查询

    详细聊一聊mysql的树形结构存储以及查询

    由于mysql是关系型数据库,因此对于类似组织架构,子任务等相关的树形结构的处理不是很友好,下面这篇文章主要给大家介绍了关于mysql树形结构存储以及查询的相关资料,需要的朋友可以参考下
    2022-04-04
  • Mysql查询数据库连接状态以及连接信息详解

    Mysql查询数据库连接状态以及连接信息详解

    这篇文章主要给大家介绍了关于Mysql查询数据库连接状态以及连接信息的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-04-04
  • mysql中json_extract的具体使用

    mysql中json_extract的具体使用

    mysql5.7版本开始支持JSON类型字段,本文主要介绍了mysql中json_extract的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • mysql允许外网访问以及修改mysql账号密码实操方法

    mysql允许外网访问以及修改mysql账号密码实操方法

    这篇文章主要介绍了mysql允许外网访问以及修改mysql账号密码实操方法,有需要的朋友们可以参考学习下。
    2019-08-08

最新评论