Edited at

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


結論

表題のとおり。

string 型とは勝手が違う。


検証

テストのために。integer 型で、limit: 1 から limit: 8 までカラムを作ってみる。


db/migrate/xxxxxxxxxxx_integer_tests.rb

class IntegerTests < ActiveRecord::Migration

def change
create_table :integer_tests do |t|
t.integer :integer1, limit: 1
t.integer :integer2, limit: 2
t.integer :integer3, limit: 3
t.integer :integer4, limit: 4
t.integer :integer5, limit: 5
t.integer :integer6, limit: 6
t.integer :integer7, limit: 7
t.integer :integer8, limit: 8
end
end
end


マイグレーションを実行する。

$ rake db:migrate

MySQLでデータ型を確認する。

mysql> desc integer_tests;

+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| integer1 | tinyint(4) | YES | | NULL | |
| integer2 | smallint(6) | YES | | NULL | |
| integer3 | mediumint(9) | YES | | NULL | |
| integer4 | int(11) | YES | | NULL | |
| integer5 | bigint(20) | YES | | NULL | |
| integer6 | bigint(20) | YES | | NULL | |
| integer7 | bigint(20) | YES | | NULL | |
| integer8 | bigint(20) | YES | | NULL | |
+----------+------------------+------+-----+---------+----------------+

すると。limit: 5 以上で設定したカラムは、すべて bigint型になっているのが分かるだろう。

つまり limit: 6 以上を指定しても。同じ bigint 型になるだけで意味はないのだ。

( 少なくとも、 bigint より大きな数値型が導入されない限りは )


string型の場合

素直に limit: = バイト数で揃う。(当たり前だが)


db/migrate/xxxxxxxxxxx_string_tests.rb

class StringTests < ActiveRecord::Migration

def change
create_table :string_tests do |t|
t.string :string1, limit: 1
t.string :string2, limit: 2
t.string :string3, limit: 3
t.string :string4, limit: 4
t.string :string5, limit: 5
t.string :string6, limit: 6
t.string :string7, limit: 7
t.string :string8, limit: 8
end
end
end

$ rake db:migrate


mysql> desc string_tests;

+---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+----------------+
| string1 | varchar(1) | YES | | NULL | |
| string2 | varchar(2) | YES | | NULL | |
| string3 | varchar(3) | YES | | NULL | |
| string4 | varchar(4) | YES | | NULL | |
| string5 | varchar(5) | YES | | NULL | |
| string6 | varchar(6) | YES | | NULL | |
| string7 | varchar(7) | YES | | NULL | |
| string8 | varchar(8) | YES | | NULL | |
+---------+------------------+------+-----+---------+----------------+


環境


  • [gem] mysql2 (0.3.18)

  • Rails 4.0.0


備考