91
67

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2016-01-25

結論

表題のとおり。
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

備考

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

メンター受付

91
67
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
91
67

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?