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.cnf 或 my.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 列表中。
ONLY_FULL_GROUP_BY 模式禁止查询中出现未分组且未聚合的列,防止返回不确定的数据行。升级后原有不符合规范的 SQL 语句会被拦截,从而抛出 1055 错误。
分步处理
步骤 1:检查当前模式
执行命令查看当前 SQL 模式配置,确认是否存在 ONLY_FULL_GROUP_BY:
SELECT @@GLOBAL.sql_mode;步骤 2:临时修改(免重启)
在“命令速用版”中执行 SET 命令,立即生效但重启后还原。适用于紧急止血。
步骤 3:永久修改(需重启)
编辑配置文件,移除 ONLY_FULL_GROUP_BY 字段。注意保留其他安全模式,不要直接清空 sql_mode。
步骤 4:修正 SQL(推荐)
修改业务代码,将 SELECT 中的非聚合字段加入 GROUP BY,或使用 ANY_VALUE() 函数包裹非聚合字段。
怎么验证是否生效
执行原本报错的 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