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
成功
推荐阅读
-
Android 5.0版本开发及以上版本的沉浸式状态栏实例
-
使用Mysql5.x以上版本出现报错#1929 Incorrect datetime value: '''' for column ''createtime''
-
解决Android 7.0及以上系统Uri.fromFile获取Uri报错问题
-
mysql5.7以上版本配置my.ini的详细步骤
-
加载MySQL、Oracle、SQL Server 2000、SQL Server 2005及以上版本 的加载数据库驱动程序
-
ECSHOP在PHP5.5及高版本上报错的解决方法
-
Mysql5.7及以上版本 ONLY_FULL_GROUP_BY报错
-
Mysql5.7及以上版本 ONLY_FULL_GROUP_BY报错的解决方法
-
使用Mysql5.x以上版本出现报错#1929 Incorrect datetime value: '''' for column ''createtime''的快速解决方法
-
Xcode9的xib只支持iOS7.0及以上版本