真正有效解决ONLY_FULL_GROUP_BY的问题

问题描述

真正有效解决ONLY_FULL_GROUP_BY的问题_第1张图片
报错 如上图 在mysql 5.7版本下可能会报如下错误

Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘×××’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

原因 是在5.7下mysql的model默认为

ONLY_FULL_GROUP_BY

含义 sql中select后面的字段必须出现在group by后面,或者被聚合函数包裹,不然会抛出上面的错误 如以下sql

select A.column1, A.column2 from table as A group by column1 //会因为ONLY_FULL_GROUP_BY的缘故抛出上面错误

问题解决

网上对与这个问题的解决有很多 但是经过我的试验都没生效,且方案都基本一致。最好我在stackoverflow找到如下方案,可生效,在数据库下执行如下sql

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

若还不行可尝试执行如下sql

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

意义 取消掉这个模式的设置

但是以上方法也存在问题,它是会话级别的,即在重启mysql服务后,设置又被重置

最终方法如下

如下是windows下
可以先在cmd中执行

mysql --help

找到配置文件读取路径
在这里插入图片描述
理论上,你可以在上面述的任何位置,加入对应的名称的配置文件,注意,位置和名称都不能错
然后写入以下文件,当然和本文相关的重点是sql_mode

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8 
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=%MYSQL_HOME%
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 设置模式
sql_mode =STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

datadir = D:\mysql-5.7.27-winx64\data

注意这里的sql_mode 是配置在[mysqld]下面的
然后就是重启mysql服务

你可能感兴趣的:(数据库)