Tag: Rails/utf8mb4

目次

関連ページ

参考情報

Rails4でMySQLで絵文字を扱う

  • MySQLのutf8では絵文字が保存できないので、utf8mb4を使う必要がある。
  • ALTER TABLEなどで変更する場合、列ごとの文字コードまで変更する必要がありめんどくさい。
  • 一旦DB全体をドロップしたutf8mb4で作りなおすのが簡単。

MySQLの設定変更

database.ymlの変更

  • encodingを変更(encodingだけじゃなく、charsetやcollationも指定しておいたほうが良いらしい)。
    default: &default
      adapter: mysql2
      encoding: utf8mb4
      charset: utf8mb4
      collation: utf8mb4_bin
      pool: 5
    

DBの作り直し

  • データのエクスポート。--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より。次に実行するrake db:resetはこれを使うので事前に作成する必要がある。
    • Rails5の場合
      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の場合
      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

データのインポート

  • そのままutf8mb4はutf8の上位互換なのでそのままインポートできる。
    mysql asl_production < data.sql

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-06-26 (月) 13:39:33