一文详解MySQL设置only_full_group_by报错问题

文 / @WordPress主题

在MySQL5.7及以上版本中,默认开启了only_full_group_by模式,这会导致在进行group by聚合操作时,如果select中的某些列没有在group by从句中出现,就会报错。出现这种情况的原因是因为该模式要求严格按照SQL标准进行操作,以保证数据的准确性和完整性。

为解决ONLY_FULL_GROUP_BY报错问题,可以通过以下方法:

1. 查看sql_mode设置

在MySQL中,可以使用如下命令查看当前的sql_mode设置:

SELECT @@sql_mode;

该命令输出的结果中,如果包含有ONLY_FULL_GROUP_BY,就说明该模式已经开启了。而对于开发环境中的MySQL5.6版本,在执行group by聚合操作时,并不会开启该模式,因此在开发过程中并不会出现该问题。

2. 去掉ONLY_FULL_GROUP_BY模式

如果要解决ONLY_FULL_GROUP_BY报错问题,就需要去掉该模式。可以使用如下命令修改全局sql_mode:

SET @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

需要注意的是,该命令只对新建的数据库有效,对于已存在的数据库,则需要在对应的数据下执行上述命令。另外,MySQL的配置文件中可能没有设置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

需要将该字段加入到[mysqld]配置内,并重启MySQL服务器,才能生效。

3. 修改MySQL配置文件

如果以上方法没有生效,可以尝试修改MySQL的配置文件。在Linux系统上,可以在/etc/my.cnf中查找sql_mode字段,如果不存在,可以手动添加:

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

需要重启MySQL服务器才能使修改生效。

总结:

ONLY_FULL_GROUP_BY模式的开启是为了确保数据在group by聚合操作时的准确性和完整性。然而,对于一些旧版本的MySQL数据库,以及一些开发过程中的sql语句,可能会因为该模式的存在而报错。为解决该问题,可以通过修改sql_mode设置以及MySQL的配置文件等方法来去掉ONLY_FULL_GROUP_BY模式。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。