web-dev-qa-db-ja.com

Rails)でMySQLstrictモードをオフにする方法

Rails 4にアップグレードすると、Rails接続に対してMySQLstrictモードがデフォルトでオンになっているようです。これは、255文字を超える文字列値を保存すると、Railsアプリで「Mysql2 :: Error:Data too long forcolumn」が発生するためです。それでも、同じクエリをMySQLコンソール(グローバルストリクトモードがオフであると報告されている)に貼り付けると、切り捨ての警告が表示されるだけで正常に機能します。さらなる証拠として、 ここに 「Rails4は両方ともデフォルトで厳密モードを使用します」と書かれています。

私の質問は、Railsアプリから厳密モードをオフにするにはどうすればよいですか?今はそれをサポートするためにすべてをアップグレードするのは避けたいです。

23
mahemoff

次のようにstrict: falseを使用して、database.ymlでstrictモードを設定できます。

production:
  Host: ...
  username: ...
  strict: false

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

23
nimblegorilla

mysql2 gemは、 接続および再接続時の初期コマンド を実行するオプションを公開します。 init_commanddatabase.ymlの内部から設定できます。

production:
  Host: ...
  username: ...
  init_command: "SET @@SESSION.sql_mode = ''"
7
Graeme

これをdatabase.ymlに追加できます

変数:
 sql_mode: '従来の' 

または

変数:
 strict_mode:false 

見る:

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

5
Arya

@edubriguentiの答えに続いて、 私はこれを見つけました 。そこに投稿とコメントを適用して、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
mahemoff

@aryaの答えは、'traditional' sql mode is strict、非strictに設定する場合は、次のことを試してください。

sql_mode: ''

それが役立つことを願っています

2
Piotr Kruczek

これを試してください:

# 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
1
edubriguenti