😭this is incompatible with sql_mode=only_full_group_by , 差一点重装Mysql

起因

今天在线上数据库,同时帮忙统计查询一个sql,查询一下有多少人下了订单。心里想着,这不是很简单的吗?直接用用group by 不就解决了吗?就在我满心欢喜的写完sql,进行执行的时候,悲剧发生了,结果出现了this is incompatible with sql_mode=only_full_group_by

随后,在网上看了教程,就是找到修改my.ini文件,然后修改sql_mode,去掉only_full_group_by就行。

当我修改之后,重启mysql服务的时候,又出现mysql本地计算机上的MySQL服务启动后停止。想着,估计是端口占用了,把相关的服务都关掉了,Mysql还是启动不起来。还把修改的复原回去,还是启动不起来。

那边用户登录不上了,平台都炸锅了,问题都压到我这边了,一气之下,重启了服务器。结果还是不行,就差重装Mysql。差一点就出现事故了!

就在这时,大佬来了,给我说:"是不是编码不对,这个编码要是ANSI格式的才行"。我一看是utf-8的,赶紧修改成ANSI,然后重启Mysql服务,服务起来了,group by 也能查询了。在这里感谢大佬!!!
大佬主页,江湖人称 闹哥 ,喜欢的可以点个赞!!😄

来来来,一步一步走进这个问题,并解决,也给自己做个记录!!!

使用场景

在使用sql进行查询的时候,遇到数据库表中有重复数据的话,需要将数据进行分组,并取出其中一条来展示,这时就需要用到group by语句。

问题重现

问题

查询:select * from t_order group by user_id LIMIT 0, 1000

错误代码: 1055

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.t_order.order_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

简单翻译一下

SELECT列表的表达式#1不在GROUP BY子句中,并且包含非聚合列"test.t_order.order_id",该列在功能上不依赖于GROUP BY子句的列;这与sqlmode=only_full_group_by不兼容

原因分析

原理层面

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

sql层面

在执行sql时候,由于开启了ONLY_FULL_GROUP_BY的设置,如果select 的字段不在 group by 中,并且select 的字段未使用聚合函数(SUM,AVG,MAX,MIN等)的话,那么这条sql查询是被mysql认为非法的,就会报错

查看原因

  1. 查询数据库版本 SELECT VERSION();
  1. 查询sql_mode select @@GLOBAL.sql_mode;

可以看出,在版本Mysql 8.0.35 中 sql_mode 开启了only_full_group_by 属性

解决方案

  1. 找到mysql安装目录,用记事本直接打开my.ini文件
  2. 编辑my.ini文件,修改sql_mode

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

  1. 修改my.ini文件编码为 ANSI很重要
  2. 重启Mysql服务

总结

一次小小问题会出现一系列结果。有好的,有坏的,有预想到的,也有预想不到的。好的是我们最希望的结果,坏的是我们所不想的,预想到的可以很快解决,预想不到的是需要大量时间来解决的。在面对问题的同时,还需要保持平常心去对待。

平时的工作学习中,还需要大量的思考、预判、总结。

加油吧,少年!!!

祝愿

愿世间永无BUG!!!😍

愿世间充满"爱码士"!!!😍 笑看人生,笑对生活!!!😆

相关推荐
Fleshy数模12 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
az44yao13 小时前
mysql 创建事件 每天17点执行一个存储过程
mysql
一点程序14 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
秦老师Q14 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
橘子1315 小时前
MySQL用户管理(十三)
数据库·mysql
Dxy123931021615 小时前
MySQL如何加唯一索引
android·数据库·mysql
我真的是大笨蛋15 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怣5015 小时前
MySQL数据检索入门:从零开始学SELECT查询
数据库·mysql
怪兽源码16 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
人道领域16 小时前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql