报错:Expression #2 of SELECT list is not in GROUP BY(only_full_group_by 模式冲突)

org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'cs_mes.z.dept_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
### The error may exist in file 

 一、问题背景

我的 SQL 是这样的(简化版):

SELECT dept_name, dept_id, COUNT(*) as user_count
FROM departments d
JOIN users u ON d.id = u.dept_id
GROUP BY dept_name;

在旧版本 MySQL 中这能正常运行,但在 MySQL 8.0+ 中会直接报错,因为 dept_id 没有出现在 GROUP BY 中,也不是聚合函数。

虽然最佳做法是修改 SQL,让所有非聚合字段都出现在 GROUP BY 中,但考虑到项目历史代码太多,且团队希望保持兼容性,通过修改 MySQL 配置,关闭 only_full_group_by 模式


二、尝试修改 sql_mode —— 结果发现:没有 my.ini!

我打开 MySQL 命令行,先查看当前的 sql_mode:

SELECT @@sql_mode;

果然,返回结果中包含:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,...

接下来,我打算修改配置文件 my.ini,去掉 ONLY_FULL_GROUP_BY

但当我进入 MySQL 安装目录:

E:\JavaWeb_study\mysql-8.0.31-winx64\mysql-8.0.31-winx64

翻了个遍,根本没有 my.ini 文件!

这下尴尬了:想改配置,却连配置文件都没有。


 三、解决方案:自己创建 my.ini!

原来,MySQL 免安装版(ZIP解压版)默认不自带 my.ini,它使用的是编译时的默认配置。

那怎么办?答案是:自己创建一个!

第一步:在 MySQL 根目录新建 my.ini

路径:

E:\JavaWeb_study\mysql-8.0.31-winx64\mysql-8.0.31-winx64\my.ini

⚠️ 注意:确保文件扩展名是 .ini,不是 .txt
可在“查看” → “文件扩展名”中确认。

第二步:写入配置内容

[mysql]
default-character-set=utf8

[mysqld]
port=3306
default_authentication_plugin=mysql_native_password
basedir=E:/JavaWeb_study/mysql-8.0.31-winx64/mysql-8.0.31-winx64/
datadir=E:/JavaWeb_study/mysql-8.0.31-winx64/mysql-8.0.31-winx64/data/
character-set-server=utf8
default-storage-engine=InnoDB
max_connections=1000
collation-server=utf8_unicode_ci
init_connect='SET NAMES utf8'
innodb_buffer_pool_size=64M
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout=120
innodb_log_buffer_size=4M
innodb_log_file_size=256M
interactive_timeout=120
join_buffer_size=2M
key_buffer_size=32M
log-error=E:/JavaWeb_study/mysql-8.0.31-winx64/mysql-8.0.31-winx64/data/mysql_error.loglog_error_verbosity=1
max_allowed_packet=16M
max_heap_table_size=64M
myisam_max_sort_file_size=64G
myisam_sort_buffer_size=32M
read_buffer_size=512kb
read_rnd_buffer_size=4M
server_id=1
skip-external-locking=on
sort_buffer_size=256kb
table_open_cache=256
thread_cache_size=16
tmp_table_size=64M
wait_timeout=120
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

[client]
port=3306
default-character-set=utf8

📌 关键点:

  • sql_mode 中去掉了 ONLY_FULL_GROUP_BY
  • 路径使用 / 而不是 \,避免转义问题

第三步:重启 MySQL 服务

# 停止服务
net stop mysql

# 启动服务(自动加载 my.ini)
net start mysql

第四步:验证配置是否生效

登录 MySQL,执行:

SELECT @@sql_mode;

你会看到返回结果中 已经没有 ONLY_FULL_GROUP_BY,说明配置成功!

此时再运行你的 Java 项目,SQL 查询恢复正常,不再报错 


 四、补充:如何确认 MySQL 加载了哪个配置文件?

你可以运行命令查看 MySQL 查找配置的顺序:

E:\JavaWeb_study\mysql-8.0.31-winx64\mysql-8.0.31-winx64\bin\mysqld --help --verbose

输出中会列出它按优先级查找的配置文件路径,例如:

C:\my.ini
C:\my.cnf
E:\JavaWeb_study\mysql-8.0.31-winx64\mysql-8.0.31-winx64\my.ini

只要你的 my.ini 在这些路径中,就会被加载。


这次踩坑让我深刻体会到:MySQL 的配置管理对开发者来说非常重要,尤其是使用免安装版时,很多配置都是“隐形”的。

通过手动创建 my.ini,我不仅解决了当前问题,还为后续调优(如字符集、连接数、日志等)打下了基础。

希望这篇文章能帮到同样遇到这个问题的你!

欢迎点赞、收藏、转发,也欢迎在评论区交流你的解决方案~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值