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

如何在Rails中关闭MySQL严格模式,mysql,ruby-on-rails,ruby-on-rails-4,database-connection,strict,Mysql,Ruby On Rails,Ruby On Rails 4,Database Connection,Strict,升级到Rails 4后,Rails连接的MySQL严格模式现在似乎默认打开了。我之所以这样说,是因为我的Rails应用程序在保存长度超过255个字符的字符串值时遇到了“Mysql2::Error:Data too long for column”。然而,我将相同的查询粘贴到MySQL控制台(全局严格模式被报告为关闭),它工作正常,只是带有截断警告。作为进一步的证据,“Rails4默认都使用严格模式” 我的问题是如何从Rails应用程序关闭严格模式?我宁愿现在避免升级所有支持它的东西。您可以将其添

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


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

您可以将其添加到您的数据库中。yml

variables: sql_mode: 'traditional' 变量: sql_模式:“传统” 或

变量: 严格模式:false 见:


@arya的答案可能不起作用,因为
'traditional'
sql模式是严格的,如果要将其设置为非严格,请尝试以下操作:

sql_mode: ''

希望有帮助

试试这个:

# 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

在@Edubliguenti的回答之后。在那里应用帖子和评论,我将以下内容添加到
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!

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

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

mysql2gem公开了一个选项来执行一个命令。您可以从
数据库.yml中设置
init_命令

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

不幸的是,这不起作用。我尝试了
innodb\u strict\u mode
(这是实际变量),但在保存记录时,将其设置为“OFF”或false仍然会导致此错误。奇怪的是,这个变量被识别了,因为如果我在同一个地方尝试任何随机变量名,它会在Rails启动时抛出一个异常。对我来说是有效的。另请参阅rails 5中最近的一项更改。这是一个很好的起点,但会导致现代rails出现错误。在我上面的回答中进行了修改。供将来的人参考,在rails 4.0.3中,这有时对我不起作用-在生产中,sql_模式有时仍然设置为严格。我也会尝试在database.yml中设置它,也许他们已经修复了这个设置。好的。它在4.1测试版上对我很有效。请使用database.yml的结果进行更新,因为我还没有尝试过它,如果它能工作,显然会更干净。我开始遇到问题,它不再像预期的那样进入严格模式。找到@nimblegorilla的答案是正确的。很好,这对我来说是有效的,并且有文档记录。看起来是正确的选择。我同意,在我的代码上进行了测试,似乎是rails 4的正确选择,而不是rails 3.2从rails 4.2开始对我有效。谢谢!这是唯一一个适用于rails 3.2应用程序的解决方案。如果不附加到当前SQL模式,而是希望完全覆盖它,则此解决方案也适用于rails 5.2应用程序
production:
  host: ...
  username: ...
  init_command: "SET @@SESSION.sql_mode = ''"