MySQL 8.0 如何禁用 ONLY_FULL_GROUP_BY
在 MySQL 8 中,ONLY_FULL_GROUP_BY 是默认启用的 SQL 模式之一。如果你希望禁用 ONLY_FULL_GROUP_BY,可以通过以下几种方式实现:
方法 1:临时禁用(仅对当前会话有效)
你可以通过修改当前会话的 sql_mode 来临时禁用 ONLY_FULL_GROUP_BY。
步骤:
-
查看当前的
sql_mode:SELECT @@sql_mode;输出可能类似于:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION -
移除
ONLY_FULL_GROUP_BY:SET SESSION sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', '')); -
验证是否已移除:
SELECT @@sql_mode;输出中不应再包含
ONLY_FULL_GROUP_BY。
方法 2:全局禁用(对所有会话有效)
如果你希望全局禁用 ONLY_FULL_GROUP_BY,可以修改全局的 sql_mode。
步骤:
-
查看当前的全局
sql_mode:SELECT @@GLOBAL.sql_mode; -
移除
ONLY_FULL_GROUP_BY:SET GLOBAL sql_mode = (SELECT REPLACE(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY', '')); -
验证是否已移除:
SELECT @@GLOBAL.sql_mode;
方法 3:通过配置文件永久禁用
如果你希望永久禁用 ONLY_FULL_GROUP_BY,可以通过修改 MySQL 配置文件来实现。
步骤:
-
打开 MySQL 配置文件:
- Linux 系统:
/etc/my.cnf 或/etc/mysql/my.cnf - Windows 系统:
my.ini
- Linux 系统:
-
找到
[mysqld] 部分,修改或添加sql_mode 配置项,移除ONLY_FULL_GROUP_BY。例如:[mysqld] sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION -
保存文件并重启 MySQL 服务:
-
Linux 系统:
sudo systemctl restart mysql -
Windows 系统:
通过服务管理器重启 MySQL 服务。
-
-
验证是否生效:
SELECT @@sql_mode;
注意事项
- 数据准确性:禁用
ONLY_FULL_GROUP_BY 后,MySQL 允许在GROUP BY 查询中使用未明确分组的非聚合列。这可能导致查询结果不确定或不准确,因此需要谨慎使用。 - 生产环境:在生产环境中,建议保持
ONLY_FULL_GROUP_BY 启用,以确保查询的准确性和一致性。 - 兼容性:禁用
ONLY_FULL_GROUP_BY 后,某些在严格模式下会报错的查询可能会正常运行,但结果可能不符合预期。
总结
- 临时禁用:使用
SET SESSION sql_mode。 - 全局禁用:使用
SET GLOBAL sql_mode。 - 永久禁用:修改 MySQL 配置文件并重启服务。
根据你的需求选择合适的方法,但请务必注意禁用 ONLY_FULL_GROUP_BY 可能带来的数据准确性问题。

浙公网安备 33010602011771号