Marvin's Blog

Hi, My friend. Welcome to my space

0%

MySql 分组错误

ONLY_FULL_GROUP_BY

select * from cnarea_2019 group by parent_code;

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

1
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

临时解决办法

在查询前先执行下面任意一种:

  • SET sql_mode=(SELECT REPLACE(@@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_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

此方案为会话级别,重新连接数据库时失效。

终极解决办法

通过执行mysql --help可以获取配置文件读取路径

1
2
Default options are read from the following files in the given order:
C:\WINDOWS\my.ini C:\WINDOWS\my.cnf C:\my.ini C:\my.cnf D:\Marvin\Data\mysql_5.7.30\my.ini D:\Marvin\Data\mysql_5.7.30\my.cnf

即为以上任意位置建立my.ini配置文件都会被mysql服务读取。配置内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\Marvin\Data\mysql_5.7.30
# 允许最大连接数
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:\Marvin\Data\mysql_5.7.30\data

重启mysql服务即可永久生效。