神様は有給消化中です。

技術ネタを書こうかな。時事ネタとか私生活ネタはうけないし。

【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