You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 16.04下MySQL 5.7.20仅全分组模式查询报错如何解决?

解决MySQL only_full_group_by 报错问题

这个问题我碰到过好多次了!本质是MySQL 5.7及以后版本默认开启了ONLY_FULL_GROUP_BY这个SQL模式,它对GROUP BY查询的规范性要求更严格:SELECT列表里的非聚合列必须要么出现在GROUP BY子句中,要么功能依赖于GROUP BY里的列。你本地环境没开这个模式,所以查询能正常跑,但服务器上的MySQL默认启用了该模式,就触发了这个错误。

下面给你三种解决方案,按需选择:

1. 临时关闭该模式(重启MySQL后失效)

适合快速测试场景,不用修改配置文件:

  • 登录MySQL服务器:mysql -u root -p
  • 执行全局模式修改:SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
  • 给当前会话同步设置(避免重新登录):SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
  • 验证是否生效:执行SELECT @@sql_mode;,输出内容里看不到ONLY_FULL_GROUP_BY就说明设置成功了。

2. 永久关闭该模式(修改配置文件,重启生效)

适合长期解决问题,不会因为MySQL重启失效:

  • 找到Ubuntu 16.04上的MySQL配置文件,通常是/etc/mysql/mysql.conf.d/mysqld.cnf(如果找不到可以用find /etc/mysql -name "*.cnf"命令查找)
  • 打开文件,定位到[mysqld]段落,添加或修改sql_mode配置:
[mysqld]
# 保留其他原有配置,只修改sql_mode
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

注意:这里的sql_mode不要包含ONLY_FULL_GROUP_BY

  • 保存文件后重启MySQL服务:sudo systemctl restart mysql
  • 再次登录MySQL验证:执行SELECT @@sql_mode;确认设置已生效。

3. 修改查询语句(最规范的做法,推荐)

从根源上符合SQL标准,避免依赖模式设置:

  • 把SELECT列表中所有非聚合的列都添加到GROUP BY子句里。比如你报错里的billpaidde6_.id,如果它不在GROUP BY里,就需要补充进去。
  • 举个例子:
    原来的错误查询:
    SELECT col1, col2, SUM(col3), billpaidde6_.id FROM your_table GROUP BY col1;
    
    修改后符合规范的查询:
    SELECT col1, col2, SUM(col3), billpaidde6_.id FROM your_table GROUP BY col1, col2, billpaidde6_.id;
    
  • 如果GROUP BY的是表的主键,理论上其他列都功能依赖于主键,MySQL会允许这种情况,但如果你的GROUP BY字段不是主键,就必须显式列出所有非聚合列。

另外补充一句:你本地环境没问题,大概率是本地MySQL版本低于5.7,或者手动关闭了ONLY_FULL_GROUP_BY模式,而服务器上的MySQL 5.7默认启用了这个严格模式。

内容的提问来源于stack exchange,提问作者xrcwrn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:45:12