开发者社区 问答 正文

技术运维问题 - MYSQL使用 -MySQL5.7版本RDS实例的ONLY_FULL_GROUP_BY



概述


本文主要介绍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

展开
收起
梨好橙 2018-09-28 22:44:19 3040 分享
分享
版权
举报
阿里云 AI 助理回答

在阿里云的云数据库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实例的参数来实现:

  1. 登录阿里云RDS控制台。
  2. 选择目标RDS实例。
  3. 在实例详情页面,点击“参数管理”或类似选项。
  4. 在参数搜索框中输入sql_mode进行搜索。
  5. 找到sql_mode参数后,点击编辑或修改。
  6. 从当前的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的选项。
  7. 保存更改,并根据提示可能需要重启RDS实例使参数生效。

请注意,关闭ONLY_FULL_GROUP_BY可能会导致一些不符合SQL标准的查询能够执行,从而引入潜在的数据处理问题。因此,在调整此设置前,请确保理解其对现有查询逻辑的影响。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答