Rails MySQLでintegerカラムに潜む罠
Railsでinteger型のカラムにinsertする際にハマったのでメモ。
以下の様なテーブルがあったとする。
user_id, integer point, integer
これに対してActiveRecordを用いてintegerのmax値を超えたデータをinsertする。
PointList.create(:user_id => 2, :point => 2247483647 => #
と一見正常に見えるがデータをロードしてみるとintegerのmax値に丸められてしまっている。
PointList.all [#]
この問題はpointカラムにvalidates_uniqueness_ofを設定している場合でもvalidate時点ではintegerを超えた値でも、
既に登録されているデータと値が異なる場合valid?がtrueとなる。
この為重複したデータがMySQL内に存在することになってしまう。
Ruby on Rails 2.3.8とMySQL5.1.48で確認しました。
SQLiteではこの問題は発生しませんでした。