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

时间:2014-01-29 01:04:03

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

升级到Rails 4,似乎MySQL严格模式现在默认为Rails连接。我这样说是因为我的Rails应用程序在保存超过255个字符的字符串值时会收到“Mysql2 :: Error:数据太长了”。然而,我将相同的查询粘贴到MySQL控制台(其中报告全局严格模式已关闭)并且它正常工作,只是截断警告。作为进一步的证据,it says here“Rails 4默认使用严格模式”。

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

6 个答案:

答案 0 :(得分:20)

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

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

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/MysqlAdapter.html

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

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

variables:
   sql_mode: 'traditional'

variables:
   strict_mode: false

请参阅:

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

答案 3 :(得分: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!

答案 4 :(得分:2)

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

sql_mode: ''

希望有所帮助

答案 5 :(得分:1)

试试这个:

# 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