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