这是mysql 8.0默认启用only_full_group_by导致的sql语义校验报错,需先确认sql_mode是否含该模式,再通过set session或配置文件调整,禁用后仍需用any_value或聚合函数确保结果确定性。

直接结论:这不是安装问题,而是MySQL 8.0默认启用ONLY_FULL_GROUP_BY后对SQL语义的强制校验——报错说明你写的GROUP BY查询本身存在非确定性,不是配置没配好。
确认是不是ONLY_FULL_GROUP_BY在报错
别凭错误信息末尾那句this is incompatible with sql_mode=only_full_group_by就直接改配置。先执行:
SELECT @@sql_mode;
如果返回结果里包含ONLY_FULL_GROUP_BY(通常排第一位),且你的错误是类似ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause,那就坐实了。注意:@@sql_mode输出是英文逗号+空格分隔的字符串,比如'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,',空格不能忽略。
临时绕过只该用于调试,且必须用正确写法
开发环境或CI流水线跑通时,只改当前会话最安全。断开重连自动还原,不影响其他连接:
SET SESSION sql_mode = (SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
- 别手拼字符串,比如
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,'——容易漏项,MySQL会自动补回默认集 - 别设空值
'',MySQL会强制恢复完整默认模式,ONLY_FULL_GROUP_BY还在 - JDBC的
connectionInitSql可能被忽略,建议在应用首次query前显式执行一次
永久修改配置必须写全sql_mode,否则白改
仅限自建MySQL,且必须重启服务才生效。在my.cnf的[mysqld]段下添加:
sql_mode ="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
- 必须显式列出全部项,不能省略、不能留空、不能只写
"",否则MySQL启动时自动补回含ONLY_FULL_GROUP_BY的默认集 - Docker环境需进容器编辑
/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,改完docker restart - 云数据库如阿里云RDS通常限制
@@GLOBAL.sql_mode写权限,SET GLOBAL会直接报ERROR 1227,只能通过控制台「参数模板」修改
真正容易被忽略的点:关了模式,结果还是不对
即使禁用了ONLY_FULL_GROUP_BY,MySQL仍可能从每组中任意选一行返回id、name等字段——这不是bug,是行为暴露。同一查询两次执行,结果可能不同;主从之间也可能因选行策略差异导致不一致。更稳妥的做法是用ANY_VALUE(id)显式声明“我只要任意值”,或者重写SQL把字段加进GROUP BY,或用MAX(name)等聚合函数明确语义。











