読者です 読者をやめる 読者になる 読者になる

ログってなんぼ

日々のメモです

Rails4+Mysqlでutf8mb4対応する

mysql rails infra
Mysql2::Error: Incorrect string valueうんちゃらなんちゃら

絵文字や一部の中国語漢字など4バイトのutf8キャラクターを利用できるようにしたメモ。

現行環境

  • mysql5.1 utf8
  • CentOS6.4

mysql5.5以上を導入

mysql5.1はutf8mb4に対応していないため、5.5以上が必須となる

MySQL :: MySQL 5.5 Reference Manual :: 10.1.11.6 The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)

準備など

  • dumpはちゃんと取っておく

MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.12 mysqldump — データベースバックアッププログラム

mysql5.1関連パッケージを削除

# yum remove mysql*

mysql5.7の導入

たとえば5.7を入れる場合

qiita.com

ありがてえありがてえ

文字コードの指定

5.1と表記が異なるため注意

[mysqld]
character-set-server=utf8mb4

[client]
default-character-set=utf8mb4

その他必要な設定

5.5/5.6を導入しても対応できるがその際にはデフォルト値ではない以下のパラメータを下記のように設定する必要あり

innodb_file_format=Barracuda
innodb_large_prefix=1
innodb_default_row_format=DYNAMIC

5.7では上記パラメータはデフォルト

https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_default_row_format

Rails側の作業

config/database.yamlのutf8部分をutf8mb4へ変更

development:
  adapter: mysql2
  encoding: utf8mb4
  charset: utf8mb4
  collation: utf8mb4_general_ci
  database: hoge

dumpを流す場合の注意

5.1現行環境からdumpしたデータを新環境に戻す場合

せっかくutf8mb4で読み書きするように構成したにもかかわらず、dumpの中のsqlがutf8で投入するようになっていてハマる事のないよう。必要に応じてダンプファイルの中身を置換するなどの対応を。小一時間ハマリました(´・ω・`)