如何在 Rails 中关闭 MySQL 严格模式

Posted

技术标签:

【中文标题】如何在 Rails 中关闭 MySQL 严格模式【英文标题】:How to turn off MySQL strict mode in Rails 【发布时间】:2014-02-20 14:37:10 【问题描述】:

升级到 Rails 4 后,Rails 连接似乎默认开启 mysql 严格模式。我这样说是因为我的 Rails 应用程序在保存超过 255 个字符的字符串值时收到“Mysql2::Error: Data too long for column”。然而,我将相同的查询粘贴到 MySQL 控制台(据报告全局严格模式已关闭),它工作正常,只是带有截断警告。作为进一步的证据,it says here“Rails 4 默认都使用严格模式”。

我的问题是如何从 Rails 应用程序中关闭严格模式?我宁愿现在避免升级所有东西来支持它。

【问题讨论】:

【参考方案1】:

您可以将其添加到您的 database.yml

变量: sql_mode: '传统'

变量: 严格模式:假

见:

https://github.com/rails/rails/pull/8346

【讨论】:

不幸的是,这不起作用。我尝试了innodb_strict_mode(这是实际变量),但是在保存记录时将其设置为“OFF”或 false 仍然会导致此错误。奇怪的是变量被识别了,因为如果我在同一个地方尝试任何随机变量名称,它会在 Rails 启动时引发异常。 为我工作。另请参阅github.com/rails/rails/issues/25924,了解 Rails 5 的最新变化。【参考方案2】:

@arya 的答案可能不起作用,因为'traditional' sql 模式严格的,如果你想将其设置为非严格,试试这个:

sql_mode: ''

希望有帮助

【讨论】:

从 Rails 4.2 开始为我工作。【参考方案3】:

试试这个:

# Set MySQL to clear sql mode for all connections
class ActiveRecord::ConnectionAdapters::MysqlAdapter 
  alias :connect_no_sql_mode :connect
  def connect
    connect_no_sql_mode
    execute("SET sql_mode = ''")
  end
end

【讨论】:

这是一个很好的起点,但会导致现代 Rails 出现错误。在我上面的答案中进行了修改。【参考方案4】:

按照@edubriguenti 的回答,I found this。在那里应用帖子和评论,我将以下内容添加到environment.rb,它看起来已经解决了问题。

# Set MySQL to clear sql mode for all connections
class ActiveRecord::ConnectionAdapters::Mysql2Adapter 
  alias :connect_no_sql_mode :connect
  def connect
    connect_no_sql_mode
    execute("SET sql_mode = ''")
  end
end

ActiveRecord::Base.connection.reconnect!

【讨论】:

仅供未来人们看到这一点,这有时对我在 Rails 4.0.3 上不起作用 - 在生产中,sql_mode 有时仍以某种方式设置为严格。我也会尝试在 database.yml 中设置它,也许他们修复了该设置。 好的。它在 4.1 beta 上对我有用。请使用 database.yml 的结果进行更新,因为我还没有尝试过,如果它有效,它显然更干净。 我开始遇到问题,它不再按预期进入严格模式。找到@nimblegorilla 的答案可以正常工作。【参考方案5】:

您可以使用strict: false 在您的database.yml 中设置严格模式,如下所示:

production:
  host: ...
  username: ...
  strict: false

https://api.rubyonrails.org/v4.2.8/classes/ActiveRecord/ConnectionAdapters/MysqlAdapter.html

【讨论】:

太好了,这对我有用并记录在案。看起来是正确的选择。 我同意,在我的代码上进行了测试,似乎是 rails 4 的正确选择,而不是 rails 3.2【参考方案6】:

mysql2 gem 公开了一个执行initial command on connect and reconnect 的选项。您可以在database.yml 内部设置init_command

production:
  host: ...
  username: ...
  init_command: "SET @@SESSION.sql_mode = ''"

【讨论】:

谢谢!这是唯一适用于 rails 3.2 应用程序的应用程序。 此解决方案也适用于 Rails 5.2 应用程序,如果您不想附加到当前 SQL 模式,而是想完全覆盖它

以上是关于如何在 Rails 中关闭 MySQL 严格模式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 应用程序中关闭 CSRF 保护?

如何在 mariadb 中关闭自动提交?

在 Rails 中关闭 json 键引用

在 Rails 3 中关闭 CSRF 令牌

在rails 3中关闭CSRF令牌

如何避免在引导程序中关闭模式