Posted at

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

More than 3 years have 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で対応?

以上です。

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