【问题标题】:How to turn off MySQL strict mode in Rails如何在 Rails 中关闭 MySQL 严格模式
【发布时间】: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 应用程序中关闭严格模式?我宁愿现在避免升级所有东西来支持它。

【问题讨论】:

    标签: mysql ruby-on-rails ruby-on-rails-4 database-connection strict


    【解决方案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 模式,而是想完全覆盖它
    猜你喜欢
    • 2015-01-01
    • 2019-12-25
    • 2023-03-05
    • 2021-12-14
    • 1970-01-01
    • 2016-10-28
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多