前言在使用MySQL 8.0 SpringBoot开发时绝大多数项目都会遇到经典报错sql_modeonly_full_group_by导致的 SQL 语法异常。该报错是因为MySQL 8.0 默认开启了严格的 GROUP BY 校验模式不兼容传统项目中常用的分组查询写法。本文将带你彻底理解报错原因 提供永久 / 临时两种解决方案 验证是否生效一次修改永久解决。一、报错信息还原报错信息如下org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Expression #43 of SELECT list is not in GROUP BY clause and contains nonaggregated column xxx.xx.xx which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by核心原因MySQL 8.0 默认启用only_full_group_by严格模式该模式要求SELECT 查询的所有字段必须出现在 GROUP BY 中或使用聚合函数MAX/SUM/COUNT 等而传统项目 / 老系统 SQL 习惯GROUP BY 主键但 SELECT 其他字段 → 在 MySQL 8.0 中直接报错。二、解决方案永久生效推荐 Docker / 服务器通用方案 1修改 MySQL 配置文件永久关闭严格模式如果你是Docker 安装 MySQL 8.01. 编辑 my.cnfbash运行vi /mydata/mysql/conf/my.cnf2. 在 [mysqld] 下添加如下配置ini[mysqld] sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION3. 重启 MySQL 容器我这里用的docker容器为例运行docker restart mysql8✅重启后立即永久生效不再报错方案 2命令行临时关闭重启 MySQL 失效适合测试环境快速验证sqlSET GLOBAL sql_mode(SELECT REPLACE(sql_mode,ONLY_FULL_GROUP_BY,)); SET SESSION sql_mode(SELECT REPLACE(sql_mode,ONLY_FULL_GROUP_BY,));三、验证是否关闭成功关键步骤登录 MySQLbash运行docker exec -it mysql8 mysql -uroot -p执行查询sqlSELECT sql_mode;成功标志结果中没有ONLY_FULL_GROUP_BY示例正确输出STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION四、SpringBoot 项目必须重启MySQL 修改成功后Java 项目必须重启因为数据库连接池会缓存旧的 SQL_MODE不重启不生效。五、为什么这样配置能解决问题原默认sql_mode包含ONLY_FULL_GROUP_BY我们修改后的配置移除了 ONLY_FULL_GROUP_BY同时保留了其他安全模式不会影响数据库稳定性也不会产生任何副作用。这是企业级项目最标准、最通用的解决方案。六、完整 my.cnf 配置可直接复制覆盖ini[mysqld] default-time_zone 8:00 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci max_connections1000 wait_timeout86400 interactive_timeout86400 default_authentication_pluginmysql_native_password sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION七、总结报错原因MySQL 8.0 默认开启only_full_group_by严格分组模式。解决步骤修改my.cnf关闭该模式重启 MySQL重启 SpringBoot 项目验证 sql_mode问题彻底解决一句话解决永久关闭 only_full_group_by重启 MySQL 即可