#author("2017-06-26T13:37:40+09:00","default:wikiwriter","wikiwriter")
&tag(Rails/utf8mb4);

*目次 [#qa6e1da1]
#contents
*関連ページ [#k06a7f2d]
*参考情報 [#h52062b8]
-[[ActiveRecordをutf8mb4で動かす - Qiita:http://qiita.com/kamipo/items/101aaf8159cf1470d823]]
-[[MySQLのencodingをutf8からutfmb4に変更して寿司ビール問題に対応する:https://techracho.bpsinc.jp/hachi8833/2016_08_25/25044]]
*Rails4でMySQLで絵文字を扱う [#z3af2636]
-MySQLのutf8では絵文字が保存できないので、utf8mb4を使う必要がある。
-ALTER TABLEなどで変更する場合、列ごとの文字コードまで変更する必要がありめんどくさい。
-一旦DB全体をドロップしたutf8mb4で作りなおすのが簡単。

**MySQLの設定変更 [#bcaf5560]
-[[MySQL/utf8mb4]]に従って設定変更する。

**database.ymlの変更 [#q011559b]
-encodingを変更(encodingだけじゃなく、charsetやcollationも指定しておいたほうが良いらしい)。
#pre{{
default: &default
  adapter: mysql2
  encoding: utf8mb4
  charset: utf8mb4
  collation: utf8mb4_bin
  pool: 5
}}

**DBの作り直し [#y34a806a]
-データのエクスポート。--no-create-infoを指定してcreate tableを除去。さらにREPLACEを使う(db:resetによってmigrationが削除されず、そのままINSERTするとmigrationテーブルが重複エラーとなるので。他の回避方法が存在するかも)。現在のデータベースコードはUTF-8とする。
 mysqldump --single-transaction --no-create-info --replace --default-character-set=binary --quick sample_production > data.sql
-initializers/ar_innodb_row_format.rbを作成する。[[ActiveRecordをutf8mb4で動かす - Qiita:http://qiita.com/kamipo/items/101aaf8159cf1470d823]]より。次に実行するrake db:resetはこれを使うので事前に作成する必要がある。
--Rails5の場合
#pre{{
module InnodbRowFormat
  def create_table(table_name, options = {})
    table_options = options.merge(options: 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC')
    super(table_name, table_options) do |td|
      yield td if block_given?
    end
  end
end

ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters
    class AbstractMysqlAdapter
      prepend InnodbRowFormat
    end
  end
end
}}
--Rails4の場合
#pre{{
ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters

    class AbstractMysqlAdapter
      def create_table_with_innodb_row_format(table_name, options = {})
        table_options = options.merge(:options => 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC')
        create_table_without_innodb_row_format(table_name, table_options) do |td|
          yield td if block_given?
        end
      end
      alias_method_chain :create_table, :innodb_row_format
    end

  end
end
}}
- 現在のschema.rbに従って作り直し
 bundle exec rake db:reset RAILS_ENV=production

**データのインポート [#m2a17511]
-そのままutf8mb4はutf8の上位互換なのでそのままインポートできる。
 mysql asl_production < data.sql

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS