Rails
MySQL

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

備考