记录sql_mode中ONLY_FULL_GROUP_BY报错问题

项目场景:

Mysql数据库 8.0+版本,安装完成之后,项目代码运行报错 SELECT list is not in GROUP BY clause and contains nonaggregated column ‘solo.aa.oId’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by


问题描述

当按照系统指引安装完成Mysql 8.0+版本之后,启动Flask项目, 发现 项目中的SQL语句报错了,导致500错误


原因分析:

查询了许多文档,原来,这个问题出现在MySQL5.7后版本上,默认的sql_mode值


解决方案:

解决方案挺多,分享Windows上一个比较实用的处理方案
1.首先查看Mysql安装目录下是否有my.ini文件
2.如果没有my.ini文件需要创建一个ini文件,首先找到Mysql安装目录 (目录默认地址C:\Program Files\MySQL\MySQL Server 8.0),创建一个txt文件,里面内容为

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_bin
init_connect='SET NAMES utf8mb4'
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
innodb_buffer_pool_size = 128M
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
# These are commonly set, remove the # and set as required.
basedir = C:\Program Files\MySQL\MySQL Server 8.0
datadir = C:\Program Files\MySQL\MySQL Server 8.0\data
port = 3306
server_id = 1
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
join_buffer_size = 128M
sort_buffer_size = 16M
read_rnd_buffer_size = 16M 
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

注意:需要将文中 basedir datadir 改为自己的安装目录地址

打开任务管理器,查看Mysql服务名称

在这里插入图片描述
打开CMD,进入 mysql安装路径
在这里插入图片描述
删除当前服务,需要输入自己的名称

sc delete MySQLD80

初始化Mysql

mysqld --initialize-insecure --user=mysql

创建一个新的Mysql服务

# 创建mysql服务
mysqld --install "MySql" --defaults-file="C:\Program Files\MySQL\MySQL Server 8.0\my.ini"

完成之后再次打开任务管理器 就可以看到我们创建的Mysql服务项,如果原来的Mysql80还是存在 可以右击 进行停止服务 就会消失

重新启动Mysql服务

net start MySql

在到CMD内输入

mysql -u root -p

这个时候会提示你输密码,当前是没有密码的,直接回车就可以进入mysql

进入mysql之后重新修改密码为 root

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

输入 exit; 退出 在重新 进入 输入刚刚的密码 root 就可以了

到这里 MySQL 内的my.ini文件创建完毕 ,然后再到文档内
[mysqld] 下面输入

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

然后重新启动Mysql服务 就可以解决问题了

SQL报错sql_mode=only_full_group_by时,这是因为MySQL的设置开启了ONLY_FULL_GROUP_BY,该设置要求在使用GROUP BY语句进行分组查询时,SELECT语句的字段必须要么出现在GROUP BY子句,要么使用聚合函数(如SUM、AVG、MAX、MIN等)。如果SELECT语句的字段既不在GROUP BY子句,也没有使用聚合函数,那么MySQL将认为这条SQL查询是非法的并报错。 为了解决这个问题,有两种方法可以尝试: 1. 查看当前的sql_mode设置:可以执行以下语句来查看当前的sql_mode设置:SELECT @@GLOBAL.sql_mode; 这将返回当前的全局sql_mode设置。如果其包含了"only_full_group_by",则说明该设置是开启的。 2. 临时修改sql_mode值:可以使用以下语句临时修改sql_mode值,去掉"only_full_group_by":SET @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; 这将修改全局的sql_mode值,去掉"only_full_group_by"设置。请注意,这种修改是暂时性的,重启MySQL服务后将会恢复为默认的设置。 希望以上信息对您有帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SQL 报错 sql_mode=only_full_group_by 问题](https://blog.csdn.net/weixin_45956838/article/details/128318353)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [MySql版本问题sql_mode=only_full_group_by的完美解决方案](https://download.csdn.net/download/weixin_38648968/12826945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值