#author("2017-06-16T23:16:26+09:00","default:wikiwriter","wikiwriter") &tag(Rails/絵文字を扱う); *目次 [#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で作りなおすのが簡単。 #author("2017-06-26T13:37:21+09:00","default:wikiwriter","wikiwriter") **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