【Rails】db:migrateでMySQLのLONGTEXT、MEDIUMTEXTを使う
MySQLで使用できる文字列型には
- CHAR:255Bまでの固定長文字列
- VARCHAR:64KBまでの可変長文字列
- TINYTEXT:255Bまでの可変長文字列
- TEXT:64KBまでの可変長文字列
- MEDIUMTEXT:約1.6MBまでの可変長文字列
- LONGTEXT:約4.3GBまでの可変長文字列
がありますが、rais g modelで普通にtextを指定するとTEXTが指定されちゃいます。
$ rails g model Test value:text // こんな感じで作成される $ rails db mysql> show columns from tests; +-------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | value | text | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +-------------+--------------+------+-----+---------+----------------+
上記に書いた通り、textだと64KBまでしか扱えません。
MySQLでは1文字1〜3文字と仮定するみたいなので、約VARCHAR(21845)が最大値になるということです。
これでは足りない場合は、migrationファイルに一工夫しましょう。
$ vim db/migrate/20150212101414_create_tests.rb class CreateTests < ActiveRecord::Migration def change create_table :articles do |t| t.text :value, :limit => 4294967295 ←「 :limit => 4294967295」を指定 t.timestamps null: false end end end // こんな感じで作成される $ rails db mysql> show columns from tests; +-------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | value | longtext | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +-------------+--------------+------+-----+---------+----------------+
ちなみにlimitの値は、以下のように対応するそう。
1 ~ 255 :TINYTEXT
256 ~ 65535 :TEXT
65536 ~ 16777215 :MEDIUMTEXT
16777216 ~ 4294967295 :LONGTEXT