Rails
MySQL
migration

【Rails・MySQL】MySQLのデータ型とRailsのマイグレーションファイルのデータ定義の対応まとめ

More than 1 year has passed since last update.

マイグレーションファイルの作成業務をしていて、MySQLとの基本的な対応は解ったけど、
TinyIntとかMidiumTextってどうやって指定するの?となったので、対応を簡単にまとめました。

軽く検証

こんなマイグレーションファイルを実行して

class CreateMigrationTest < ActiveRecord::Migration
  def change
    create_table :migration_tests,id:false do |t|
        t.string :string
        t.string :string_limit, :limit => 10 # limit => 数値でlimitを指定
        t.string :string_nonnull, null:false #null:boolean で nullの可否を指定
        t.text :tiny_text, :limit => 255 #limitの範囲が1~255でTINYTEXT
        t.text :text #何も指定しない、又はlimitの範囲が256~65535でTEXT
        t.text :medium_text, :limit => 16777215 # limitの範囲が65536~16777215でMEDIUMTEXT
        t.text :long_text, :limit => 4294967295 # limitの範囲が16777216 ~ 4294967285でLONGTEXT
        t.float :float
        t.float :double, :limit => 53 # limitの範囲が24~53でdouble
        t.integer :tinyint,:limit => 1
        t.integer :int, :limit => 4
        t.integer :bigint, :limit => 8
        t.decimal :decimal;
        t.decimal :decimal_option, precision: 15, scale: 3,null:false
        t.datetime :datetime
        t.time :time
        t.date :date
        t.binary :tiny_blob, :limit => 256 #256Byte以下はvarvinary
        t.binary :blob #指定なし(64KB以下)はBROB
        t.binary :medium_blob, :limit => 15.megabytes #16MB以下はMEDIUMBROB
        t.binary :long_blob, :limit => 3.gigabytes #4GB以下はLONGBROB
        t.boolean :boolean
        t.column :primary, 'VARCHAR(30) PRIMARY KEY' # 他対応していないものはcolumnを使う
    end
  end
end

作成されたテーブルを確認すると、こうなる

mysql> desc migration_tests;

+----------------+----------------+------+-----+---------+-------+
| Field          | Type           | Null | Key | Default | Extra |
+----------------+----------------+------+-----+---------+-------+
| string         | varchar(255)   | YES  |     | NULL    |       |
| string_limit   | varchar(10)    | YES  |     | NULL    |       |
| string_nonnull | varchar(255)   | NO   |     | NULL    |       |
| tiny_text      | tinytext       | YES  |     | NULL    |       |
| text           | text           | YES  |     | NULL    |       |
| medium_text    | mediumtext     | YES  |     | NULL    |       |
| long_text      | longtext       | YES  |     | NULL    |       |
| float          | float          | YES  |     | NULL    |       |
| double         | double         | YES  |     | NULL    |       |
| tinyint        | tinyint(4)     | YES  |     | NULL    |       |
| int            | int(11)        | YES  |     | NULL    |       |
| bigint         | bigint(20)     | YES  |     | NULL    |       |
| decimal        | decimal(10,0)  | YES  |     | NULL    |       |
| decimal_option | decimal(15,3)  | NO   |     | NULL    |       |
| datetime       | datetime       | YES  |     | NULL    |       |
| time           | time           | YES  |     | NULL    |       |
| date           | date           | YES  |     | NULL    |       |
| tiny_blob      | varbinary(256) | YES  |     | NULL    |       |
| blob           | blob           | YES  |     | NULL    |       |
| medium_blob    | mediumblob     | YES  |     | NULL    |       |
| long_blob      | longblob       | YES  |     | NULL    |       |
| boolean        | tinyint(1)     | YES  |     | NULL    |       |
| primary        | varchar(30)    | NO   | PRI | NULL    |       |
+----------------+----------------+------+-----+---------+-------+

対応表

MySQL Rails
varchar(255) string
varchar(文字数) string #limitで文字数を指定
tinytext text #limitの範囲が1~255
text text
midiumtext text #limitの範囲が65536~16777215
longtext text #limitの範囲が16777216 ~ 4294967285
float float
double float #limitの範囲が24~53
tinyint integer #limitが1
smallint integer #limitが2
int integer #limitが4
bigint integer #limitが8
decimal decimal
decimal(M,D) decimal #precision: M, scale: D
datetime datetime
time time
date date
blob binary
mediumblob binary #limitが16MB以下
longblob binary #limitが4GB以下
tinyint(1) boolean
その他 columnで対応?

以上です。
間違ってる箇所、追記すべき箇所があればコメントください。