如何使用多个值设置 Amazon RDS SQL_MODE

How to set Amazon RDS SQL_MODE with multiple values

MySQL 允许在 my.cnf 文件中将参数 SQL_MODE 设置为多个值。我如何在 Amazon RDS 上执行相同的操作?

更新:这个问题已经解决了...见下文。

MySQL 允许在 my.cnf 文件中将参数 SQL_MODE 设置为多个值。但是,Amazon RDS 只允许一个值,无论您使用他们基于浏览器的控制台还是他们的 CLI 工具。

我找到了一个(也许不完美)解决无法将 SQL_MODE 设置为多个值的问题的方法。在下面的过程中,我展示了我的设置。您可以选择您认为与您的环境相关的任何值。

1) 在您的参数组中,设置 SQL_MODE = TRADITIONAL(或者哪个值是您的最高优先级)

2) 在您的参数组中,将 init_connect 设置为: 设置会话 sql_mode = 'TRADITIONAL,IGNORE_SPACE,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY'

现在,当客户端登录数据库时,他们的会话 SQL_MODE 应该设置为 init_connect 字符串传入的所有值。在我的例子中,这相当于:IGNORE_SPACE、ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、传统,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

警告:在设置 init_connect 值后编辑它涉及剪切粘贴。但是,我发现在设置 init_connect 值后尝试删除它是一件很麻烦的事情,因此在使用它时要小心。麻烦吗?要在设置后删除 init_connect 值,我需要从头开始创建一个新的 parm 组,将 init_connect 以外的所有值设置为原始 parm 组所具有的值,删除原始 parm 组,然后重命名新的组与旧名称。 Firefox 和 Chrome 都是如此。我也无法使用 CLI 工具删除该值 (aws rds modify-db-parameter-group)。

虽然不是这个 post 的一部分,但如果有人回答如何 delete/reset/null-out init_connect 而没有我上面描述的那种麻烦,那就太好了。

更新 1:

没关系。我发现 init_connect 设置(在 RDS 上)将无法在数据库重新启动后继续存在。因此,我上面提供的解决方案不起作用。

此外,由于无法通过控制台删除(删除)init_connect 设置(为什么不呢?),可以使用 aws rds reset-db-parameter- 删除它group CLI 命令而不是像我之前描述的那样重建整个参数组。

我对 Amazon RDS 非常失望:

  • 不允许多个 SQL_MODE 值。
  • 不允许我们通过控制台删除 init_connect 设置。

更新 2:

根据 Ross Scrivener 的回复,我测试了通过 AWS 控制台设置多个 SQL_MODE 值。我使用值 'TRADITIONAL,IGNORE_SPACE,ONLY_FULL_GROUP_BY'(无空格)。然后我重新启动了服务器两次,一切似乎都正常了。

感谢 Amazon 解决此问题,感谢 Ross Scrivener 指出 AWS 的变化。

亚马逊似乎已于 2016 年 5 月 24 日解决了这个问题

The sql_mode parameter can now be set to a list of values for all MySQL and MariaDB versions. The list of values should be correct in all regions as well.

https://forums.aws.amazon.com/thread.jspa?threadID=232266