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,我不仅解决了当前问题,还为后续调优(如字符集、连接数、日志等)打下了基础。
希望这篇文章能帮到同样遇到这个问题的你!
欢迎点赞、收藏、转发,也欢迎在评论区交流你的解决方案~
1144

被折叠的 条评论
为什么被折叠?



