概述
本文主要介绍MySQL5.7版本RDS实例的 ONLY_FULL_GROUP_BY。
问题描述
使用 sql_mode设置SQL模式,如下所示,并没有设置 ONLY_FULL_GROUP_BY。然后使用 select @@global.sql_mode语句,查看仍然包含 ONLY_FULL_GROUP_BY。
sql_mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_UNSIGNED_SUBTRACTION,NO_DIR_
IN_CREATE,POSTGRESQL,ORACLE,MSSQL,DB2,MAXDB,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,MYSQL
323,MYSQL40,ANSI,NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,
NO_ZERO_IN_DATE,NO_ZERO_DATE,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,HIGH_NOT
_PRECEDENCE,NO_ENGINE_SUBSTITUTION,PAD_CHAR_TO_FULL_LENGTH
问题原因
上述
sql_mode
中包含了ANSI,而 ONLY_FULL_GROUP_BY
是ANSI的子集,所以会自动设置为 ONLY_FULL_GROUP_BY
。
适用于
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在阿里云的云数据库RDS服务中,MySQL 5.7版本默认启用了ONLY_FULL_GROUP_BY
SQL模式,这是为了遵循SQL标准并防止在使用GROUP BY
操作时出现非明确的行为。即使您在sql_mode
设置中没有直接包含ONLY_FULL_GROUP_BY
,只要设置了包含ANSI标准的模式(如您的配置中的ANSI
),MySQL将自动包含ONLY_FULL_GROUP_BY
规则,因为它属于ANSI SQL规范的一部分。
当ONLY_FULL_GROUP_BY
启用时,意味着在GROUP BY
语句中,SELECT列表中的每一列都必须是聚合函数的参数,或者是GROUP BY子句中的列。这有助于避免查询结果的不确定性,确保每个分组的输出都是明确且可预测的。
如果您确实需要关闭ONLY_FULL_GROUP_BY
以兼容旧有的应用程序逻辑,可以通过修改RDS实例的参数来实现:
sql_mode
进行搜索。sql_mode
参数后,点击编辑或修改。sql_mode
值中移除ANSI
或者直接指定不包含ONLY_FULL_GROUP_BY
的模式列表,例如可以设置为:REAL_AS_FLOAT,PIPES_AS_CONCAT,IGNORE_SPACE,...,NO_ENGINE_SUBSTITUTION,PAD_CHAR_TO_FULL_LENGTH
,确保去除了可能导致自动添加ONLY_FULL_GROUP_BY
的选项。请注意,关闭ONLY_FULL_GROUP_BY
可能会导致一些不符合SQL标准的查询能够执行,从而引入潜在的数据处理问题。因此,在调整此设置前,请确保理解其对现有查询逻辑的影响。