Edited at

Rails migrationでintegerを使う時の注意点〜integerのlimitはバイト数だった〜

More than 1 year has passed since last update.


limitの定義に注意:eyes:

マイグレーションファイルでintegerのカラムにlimitを定義する際に注意しないといけないことがある。


integerのlimitとstringのlimitでは意味合いが違う:dancer:

例えば以下のように記述する。

t.integer :num, limit: 11, null: false, comment: "integerカラム"

t.string :str, limit: 100, null: false, comment: "stringカラム"

一見何も問題ないように見えるが以下のようなエラーがでる。

StandardError: An error has occurred, all later migrations canceled:

No integer type has byte size 11
/prj/db/migrate/20170620050536_tests.rb:3:in `change'
ActiveRecord::ActiveRecordError: No integer type has byte size 11


integerのlimitはバイト数だった:rolling_eyes:

integerのlimitは桁数ではない。バイト数だった!

stringのlimitは桁数なのにね!

な!の!で!

num | int(11)    

というカラムを作りたい場合のlimitは4です

t.integer :num, limit: 4, null: false, comment: "integerカラム"

limitに4以外を指定した場合に生成されるカラムは以下を参照してください。

Rails | マイグレーションで integer カラムを作る時の :limit は、桁数指定ではない ( バイト数指定だ )