search
LoginSignup
146
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

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

マイグレーションファイルの作成業務をしていて、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で対応?

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

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
What you can do with signing up
146
Help us understand the problem. What are the problem?