俺でもできるもんな

独立系SI企業から完全異業種のベンチャー企業に転職、社内のITインフラを整えるべく颯爽と登場した自称天才プログラマー俺のハートフルブログ

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

limitの定義に注意

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

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

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

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はバイト数だった

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

な!の!で!

num | int(11)    

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

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

limitに4以外を指定した場合に生成されるカラムは以下を参照してください。
Rails | マイグレーションで integer カラムを作る時の :limit は、桁数指定ではない ( バイト数指定だ )