Question

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.

Was it helpful?

Solution

You can set strict mode in your database.yml using strict: false as follows:

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

https://api.rubyonrails.org/v4.2.8/classes/ActiveRecord/ConnectionAdapters/MysqlAdapter.html

OTHER TIPS

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:

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

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top