11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rails6.0のMySQLに関する変更点まとめ

Last updated at Posted at 2019-04-30

いよいよRails6.0がリリースされますね!
個人的にRailsのDBはMySQLを使うことが多いので、Rails6.0のMySQLに関する変更点をまとめてみました。

#1. textカラムとblobカラムに:sizeオプションが追加
textblobのサイズを変更するために、:sizeオプションが追加されました。

Railsのカラムの型とMySQLのデータ型の対応は、以下のようになります。

Railsのカラムの型 :sizeオプションの値 MySQLのデータ型 最大長
text tiny TINYTEXT 255バイト
text なし TEXT 65,535バイト
text medium MEDIUMTEXT 16,777,215バイト
text long LONGTEXT 4,294,967,295バイト
binary tiny TINYBLOB 255バイト
binary なし BLOB 65,535バイト
binary medium MEDIUMBLOB 16,777,215バイト
binary long LONGBLOB 4,294,967,295バイト

実際にmigrationで書くとこんな感じです。

create_table :blogs do |t|
...
  t.text :content, size: :medium
...
end

#2. DEFAULTの関数指定と式インデックスをサポート
MySQL 8.0.13から追加された、以下2つの機能をサポートするようになりました。

##2-1. DEFAULTの関数指定(default expression)
supports_default_expression?というメソッドが用意されており、PostgreSQLかMySQLか、MySQLなら8.0.13以降か、という判定をしています。

実際にmigrationの時に使うとこんな感じです。

create_table :products, force: true do |t|
...
  if supports_default_expression?
    t.binary :uuid, limit: 36, default: -> { "(uuid())" }
  end
...
end

##2-2. 式インデックス(expression indexes)
こちらもsupports_expression_index?というメソッドが用意されており、MySQLのバージョンが8.0.13以降かの判定をしています。

実際にmigrationの時に使うとこんな感じです。

create_table :students, force: true do |t|
...
  t.string  :name
  t.integer :rating, default: 1
...
  if supports_expression_index?
    t.index "(CASE WHEN rating > 0 THEN lower(name) END) DESC", name: "student_expression_index"
  end
end

#3. TIME,DATETIME,TIMESTAMPのデフォルト値の桁数指定が可能に
TIME,DATETIME,TIMESTAMPのデフォルト値に関する修正です。
デフォルト値の秒の少数部の桁数を、0~6で指定できるようになりました。

以下のようにdefault:オプションを指定すると、デフォルト値にCURRENT_TIMESTAMP(6)が設定されます。

create_table :enquetes, force: true do |t|
...
  t.datetime "answered_at", precision: 6, default: -> { "current_timestamp(6)" }, null: false
end

#4. デフォルトの文字セットがutf8mb4
Rails5.2まではMySQLのデフォルトの文字セットはutf8でしたが、Rails6.0からはutf8mb4に変更になりました。

絵文字などをサポートするために、変更したようです。

#5. 対応バージョンがMySQL 5.5.8以降に
Rails5.2まではActiveRecordがサポートするMySQLのバージョンは5.1.10以降でしたが、Rails6.0からは5.5.8以降に引き上げられました。

MySQL 5.1系ではutf8mb4をサポートしていないために、対応したようです。

#6. ROW_FORMAT=DYNAMICがデフォルトオプションに
ROW_FORMAT=DYNAMICcreate table時のデフォルトオプションになりました。

これでMySQL 5.6まででutf8mb4を扱う場合に、設定しやすくなりました。

11
5
0

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
  3. You can use dark theme
What you can do with signing up
11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?