问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

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

发布网友 发布时间:2024-09-17 08:03

我来回答

1个回答

热心网友 时间:2024-09-29 04:40

背景

最近开发的时候,需要使用MySQL的数据库,在使用groupby的时候,生产环境使用的是5.6版本,但是开发机上面装的docker版本是5.7,在调用接口的时候,发现报错了,通过查询对应的资料,是因为MySQL5.7版本,默认开启了ONLY_FULL_GROUP_BY,所以在使用groupby的时候,不能存在多余的字段信息。

现象回顾表结构准备CREATETABLE`user`(`id`intNOTNULLAUTO_INCREMENT,`name`varchar(255)DEFAULTNULL,`sex`varchar(255)DEFAULTNULL,`age`intDEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=4DEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ciidnamesexage1张三男212李四男203小花女21

执行SQL

SELECT*FROM`user`GROUPBYage

出现报错1055-Expression#1ofSELECTlistisnotinGROUPBYclauseandcontainsnonaggregatedcolumn'test.user.id'whichisnotfunctionallydependentoncolumnsinGROUPBYclause;thisisincompatiblewithsql_mode=only_full_group_by,Time:0.064000s

原因分析

MySQL的官方文档,给出如下的解释:

MySQL5.7.5andlaterimplementsdetectionoffunctionaldependence.IftheONLY_FULL_GROUP_BYSQLmodeisenabled(whichitisbydefault),MySQLrejectsqueriesforwhichtheselectlist,HAVINGcondition,orORDERBYlistrefertononaggregatedcolumnsthatareneithernamedintheGROUPBYclausenorarefunctionallydependentonthem.(Before5.7.5,MySQLdoesnotdetectfunctionaldependencyandONLY_FULL_GROUP_BYisnotenabledbydefault.Foradescriptionofpre-5.7.5behavior,seetheMySQL5.6ReferenceManual.)

官方大致的意思是说,在5.7.5版本之后,将会开启ONLY_FULL_GROUP_BY,开启此配置之后,在select、having或者orderby的时候,将拒绝使用非聚合列的查询。

针对上述的SQL,也就是在select+groupby的时候,只能查询与groupby相关列的查询。

解决办法方法一:优化SQL

其实个人觉得,最好的办法,就是优化SQL,剔除掉无关的查询操作,将与groupby相关的查询去掉:

SELECTcount(1),ageFROMuserGROUPBYage

方法二:更改配置文件

将容器的内的配置文件,拷贝到宿主机,挂接映射关系,然后在mysqld下增加sql_mode的配置sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

docker-compose.yml

version:'3.1'services:db:image:mysqlcommand:--default-authentication-plugin=mysql_native_passwordrestart:alwaysvolumes:-/root/docker-mysql/conf/mysql:/etc/mysql-/root/docker-mysql/mysql:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD:rootcontainer_name:test-mysqlports:-3307:3306

my.cnf

[mysqld]pid-file=/var/run/mysqld/mysqld.pidsocket=/var/run/mysqld/mysqld.sockdatadir=/var/lib/mysqlsql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONsecure-file-priv=NULL#Customconfigshouldgohere!includedir/etc/mysql/conf.d/

重启容器,查看效果

mysql>SELECT@@sql_mode;+----------------------------------------------------------------------------------------------------+|@@sql_mode|+----------------------------------------------------------------------------------------------------+|STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION|+----------------------------------------------------------------------------------------------------+1rowinset(0.00sec)mysql>SELECT*FROMuserGROUPBYage;+----+--------+------+------+|id|name|sex|age|+----+--------+------+------+|1|张三|男|21||2|李四|男|20|+----+--------+------+------+2rowsinset(0.00sec)方法三:更改启动命令

docker-compose.yml

version:'3.1'services:db:image:mysqlcommand:mysqld--sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"--default-authentication-plugin=mysql_native_passwordrestart:alwaysvolumes:-/root/docker-mysql/conf/mysql:/etc/mysql-/root/docker-mysql/mysql:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD:rootcontainer_name:test-mysqlports:-3307:3306

销毁容器:docker-composedown重启容器:docker-composeup-d

查看效果:

mysql>SELECT@@sql_mode;+----------------------------------------------------------------------------------------------------+|@@sql_mode|+----------------------------------------------------------------------------------------------------+|STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION|+----------------------------------------------------------------------------------------------------+1rowinset(0.00sec)mysql>setnamesutf8;QueryOK,0rowsaffected,1warning(0.00sec)mysql>SELECT*FROMuserGROUPBYage;+----+--------+------+------+|id|name|sex|age|+----+--------+------+------+|1|张三|男|21||2|李四|男|20|+----+--------+------+------+2rowsinset(0.00sec)
DockerMysql5.7及以上版本ONLY_FULL_GROUP_BY报错的解决方法

version:'3.1'services:db:image:mysqlcommand:mysqld--sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"--default-authentication-plugin=mysql_native_passwordrestart:alwaysvolumes:-/root/docker-mysql/conf/mysql:/etc/mysql-/root...

docker启动mysql报错

解决端口冲突问题的关键是找到并释放被占用的端口资源。在确认是由于之前安装的MySQL导致端口冲突后,建议采取以下步骤:重新安装一个带有Docker环境的虚拟机镜像。这样可以确保MySQL服务在新的环境下启动,避免端口冲突问题。在执行这一操作时,务必确认新镜像已正确安装了所需版本的Docker以及兼容的MySQL服务。...

【Docker】Docker安装Mysql5.7

解决 MySQL 5.7 的查询兼容问题,这通常与版本特定的特性或修复有关,可能需要根据实际情况调整 MySQL 配置或升级容器镜像。处理密码修改不兼容的问题,可能涉及配置文件的修改,确保与新版本的 MySQL 兼容。启动 Docker 中的 MySQL 时,可以通过添加参数来定制容器的行为,例如:bash docker run -d --...

docker 启动mysql5.7命令

docker run --privileged=true -p 3306:3306 --name mysql5.7 -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d docker.io/mysql:5.7 -p 端口映射 --name 启动容器名称 -v 目录挂载 ...

applem2不支持dockermysql5.7

原因如下:1、Docker上的MySQL5.7是为基于x86架构的计算机设计的,而AppleM1芯片使用的是基于ARM架构的处理器。这意味着Docker容器中的MySQL5.7二进制文件无法在M1芯片上运行,因为它们是不同的架构。2、MySQL5.7是为x86架构编译的,因此其中的某些部分会依赖于x86特定的指令集或库,而这些指令集和库...

docker mysql登录时出现Access denied for user ‘root‘@‘localhost...

首先,确保在MySQL容器内安装了vim编辑器,这对于后续操作至关重要。然后,打开编辑器并定位到配置文件 /etc/mysql/conf.d/docker.cnf。在该文件中,添加一行"skip-grant-tables",这将临时跳过密码验证,以便进行密码修改。完成修改后,别忘了退出并重启MySQL容器,让新设置生效。接下来,重新登录到容器...

...安装Docker版MySQL - 镜像 bitnami/mysql:5.7.43-debian-11-r73_百...

镜像选择 MySQL的Docker镜像多种多样,常见的是MySQL的官方镜像,另一种是bitnami/mysql。所有镜像可在Docker Hub或官方GitHub仓库中找到,使用前需查看使用说明,了解配置和运行方法。MySQL官方镜像更原汁原味,而bitnami版本提供了更多安全性和易用性。Bitnami为MySQL提供Docker镜像,优化性能和安全性,包含预...

【Docker】MySQL 源码构建 Docker 镜像(基于 ARM 64 架构)

步骤一,使用dfimage获取MySQL 5.7.40的原始Dockerfile,注意其原文件中通过yum安装的逻辑不适用于ARM64,因为官方yum源缺少该版本的ARM64 rpm。所以,你需要:在ARM环境中安装必要的依赖下载源码并安装修改源码配置以适应ARM架构编译源码生成rpm文件,结果存放在/root/rpmbuild/RPMS/aarch64目录构建镜像的...

Docker - 搭建部署(Nginx+Mysql+Redis)应用服务和解决MacDocker0问题...

使用docker搭建一个php、redis、mysql、nginx的常用实例,基础好的同学可直接跳过前面的基础讲解,直接开始实战,其中解决了Mac docker中实例间网络不通的问题,对docker宿主机的磁盘映射、网络通信有了更深层次的理解。镜像操作 1.查看docker版本 2.获取镜像 一般来说,镜像的latest标签意味着该镜像的内容会...

使用docker实现Mysql主从复制

利用Docker搭建主从服务器首先拉取docker镜像,我们这里使用5.7版本的mysql:dockerpullmysql:5.7 然后使用此镜像启动容器,这里需要分别启动主从两个容器 Master(主):dockerrun-p3339:3306--namemysql_master-eMYSQL_ROOT_PASSWORD=123456-dmysql:5.7 Slave(从):dockerrun-p3340:3306--namemysql_slave...

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
内蒙古大学满洲里学院奖学金和保障 内蒙古自治区关于工伤保险与人身损害赔偿的规定 关于内蒙古惠蒙保,因为意外伤害发生的住院都可以理赔吗? 飞翔石家庄歌词 飘渺之旅之系列书有哪些 我要想知道飘渺之旅系列的所有书籍. 也就是.飘渺尊者旅2之后的书. 《飘渺神之旅》的续集、书名叫什么名字? 《飘邈之旅》后续到底有哪些啊 飘邈之旅、飘渺神之旅、飘渺尊者、飘渺尊... 飘渺之旅之后该看什么? 猪不吃食。没精神 喜欢的人会在梦中相见吗 微信收了钱不发货怎么办? 明星的MV是怎么拍摄的啊 一个欧美女明星的MV 就是拍完一个场景然后去... 请问和明星一起拍MV的一般是什么人? 像哪些明星开一次演唱会大概得多少钱? 仓鼠怎么繁殖 其实繁衍仓鼠要这样做 仓鼠是怎样繁殖的? 天山翡丽公馆怎么样?好不好?值不值得买? 世界之窗门票怎么订便宜_故宫博物院怎么预约门票便宜 飞猪旅行怎样买景点门票,飞猪上面买景区门票 飞猪抢故宫的票靠谱吗_旅游选择携程网靠谱吗 ...面试者一同进入。结束后,随后让我做一份性格测评,另个人没有让她做... 福神有过这件衣服吗 肺气肿的表现有哪些 肺气肿什么症状 在excle输入数字为何最后一位变0 什么牌子的男装质量不错? 十大男装品牌排行榜品牌排行,男装品牌排行榜前十名_男装品牌有... 哪些牌子男装好看 男装品牌有哪些牌子?男装品牌大全排行榜前十 【docker系列】Codimd在线Markdown方案 别再用kill-9了,这才是微服务上下线的正确姿势! 并列句和状语从句 并列句的例子大全 英语-并列句 并列句句型结构 女朋友跟我说处对象没劲,怎么办? 两个人在一起处对象,处了一段时间,双方都感觉累,是为什么啊,,,_百度... Docker 容器优雅终止方案 仓鼠的生殖器是怎样的? 侏儒鼠可以同居吗? 沙漠侏儒仓鼠怎么才能认出那个是母的 肺性脑病甘露醇打几天 肺性脑病的典型表现 肺心病急性加重期治疗的关键是( )。 用一句话描写秋天的美景 一句话描写立秋景色 2024年农历四月二十一是黄道吉日吗 2024年农历四月二十是什么日子 2024农历四月二十是什么日子
  • 焦点

最新推荐

猜你喜欢

热门推荐