Upgrading to Rails 4, it seems MySQL strict mode is now on by default for Rails connections. I say this because my Rails app is getting "Mysql2::Error: Data too long for column" when saving a string value longer than 255 characters. Yet, I paste the same query into MySQL console (where global strict mode is reported to be off) and it works fine, just with truncation warnings. As further evidence, it says here "Rails 4 both use strict mode by default".
My question is how can I turn strict mode off from the Rails app? I'd rather avoid upgrading everything to support it right now.
You can set strict mode in your database.yml using strict: false
as follows:
production:
host: ...
username: ...
strict: false
http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/MysqlAdapter.html
The mysql2
gem exposes an option to execute an initial command on connect and reconnect. You can set the init_command
from inside database.yml
:
production:
host: ...
username: ...
init_command: "SET @@SESSION.sql_mode = ''"
You can add this to your database.yml
variables: sql_mode: 'traditional'
or
variables: strict_mode: false
See:
Following @edubriguenti's answer, I found this. Applying the post and the comment there, I added the following to environment.rb
and it looks to have solved the problem.
# 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!
@arya 's answer might not work because 'traditional'
sql mode is strict, if you want to set it to non-strict, try this:
sql_mode: ''
Hope that helps
Try this:
# 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
来源:https://stackoverflow.com/questions/21420122/how-to-turn-off-mysql-strict-mode-in-rails