MySQL 8.0 升级后 group by 语法报错 1055 怎么解决?

文章导读
MySQL 8.0 升级后出现 1055 报错是因为默认开启了 ONLY_FULL_GROUP_BY 模式,要求 SELECT 列表中的字段必须出现在 GROUP BY 子句或使用聚合函数。最推荐的解决方式是修改 SQL 语句符合规范,临时解决可以通过调整 sql_mode 配置。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

MySQL 8.0 升级后出现 1055 报错是因为默认开启了 ONLY_FULL_GROUP_BY 模式,要求 SELECT 列表中的字段必须出现在 GROUP BY 子句或使用聚合函数。最推荐的解决方式是修改 SQL 语句符合规范,临时解决可以通过调整 sql_mode 配置。

先说结论:错误 1055 由 SQL 模式限制引起,修改配置可快速恢复业务,修正 SQL 才是长期方案。

  • 先确认:检查当前 sql_mode 是否包含 ONLY_FULL_GROUP_BY
  • 先处理:临时通过命令移除该模式,永久通过配置文件修改。
  • 再验证:重新执行报错 SQL 并检查全局配置是否生效。

命令速用版

如果急需恢复业务,可在 MySQL 客户端执行以下命令临时移除限制(重启后失效):

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

如需永久生效,需在 my.cnfmy.ini[mysqld] 段落添加配置:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

为什么会这样

MySQL 5.7 及 8.0 版本默认启用了更严格的 SQL 模式,而早期版本(如 5.6)允许非聚合字段出现在 SELECT 列表中。

MySQL 8.0 升级后 group by 语法报错 1055 怎么解决?

ONLY_FULL_GROUP_BY 模式禁止查询中出现未分组且未聚合的列,防止返回不确定的数据行。升级后原有不符合规范的 SQL 语句会被拦截,从而抛出 1055 错误。

分步处理

步骤 1:检查当前模式

执行命令查看当前 SQL 模式配置,确认是否存在 ONLY_FULL_GROUP_BY

SELECT @@GLOBAL.sql_mode;

步骤 2:临时修改(免重启)

在“命令速用版”中执行 SET 命令,立即生效但重启后还原。适用于紧急止血。

MySQL 8.0 升级后 group by 语法报错 1055 怎么解决?

步骤 3:永久修改(需重启)

编辑配置文件,移除 ONLY_FULL_GROUP_BY 字段。注意保留其他安全模式,不要直接清空 sql_mode

步骤 4:修正 SQL(推荐)

修改业务代码,将 SELECT 中的非聚合字段加入 GROUP BY,或使用 ANY_VALUE() 函数包裹非聚合字段。

MySQL 8.0 升级后 group by 语法报错 1055 怎么解决?

怎么验证是否生效

执行原本报错的 SQL 语句,若不再返回 Error 1055 则处理成功。再次运行 SELECT @@GLOBAL.sql_mode; 确认配置中已无 ONLY_FULL_GROUP_BY 字符串。

常见坑

  • 重启失效:仅执行 SET 命令未改配置文件,数据库重启后报错会重现。
  • 逻辑错误:移除模式可能掩盖 SQL 逻辑缺陷,导致查询结果不确定。
  • 配置覆盖:某些发行版 MySQL 可能加载多个配置文件,需确认最终生效的文件路径。

常见问题

移除 ONLY_FULL_GROUP_BY 会影响性能吗?

不会直接影响性能,但可能返回不符合预期的数据行。

如何找到具体是哪个字段报错?

错误信息中会明确指出 Expression #X of SELECT list,对应 SELECT 后的第几个字段。

MySQL 8.0 默认 sql_mode 有哪些?

通常包含 ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE 等,具体以实际查询结果为准。

参考来源

  • MySQL Official Documentation, "GROUP BY Handling", https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
  • MySQL Official Documentation, "SQL Modes", https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html