MySQLのcharacterとcollateを変更して絵文字を挿入できるようにする方法 | AWS x Rails

こんにちは!Pentagonの山本です。今回、すでに運用しているアプリにて「絵文字を入力できるようにしてほしい」と要望があったため対応しました。RailsでAPIを実装しているのですが、地味に苦戦したので対処方法をまとめます。

【こんな人に読んで欲しい】

すでにDBを運用しているのでDBの削除が難しい人
絵文字をDBに挿入したい人

【この記事を読むメリット】

DBを削除しなくても、characterとcollateを変更して絵文字を挿入できるようになります。

【結論】

絵文字を挿入したい場合、DBのcharsetをutf8ではなくutf8mb4にする必要があります。
MySQLを変更するのに加えるだけではなく、Railsのdatabase.ymlの調整も必要です。

目次

MySQLのデータベース・テーブル・カラムを変更

状況に応じて、データベース・テーブル・カラムのcharacterとcollateを変更してください。

データベースを変更したい場合

alter database <database> character set utf8mb4 collate utf8mb4_unicode_ci;

テーブルを変更したい場合

alter table posts character set utf8mb4 collate utf8mb4_unicode_ci;

カラムを変更したい場合

alter table posts modify body text character set utf8mb4 collate utf8mb4_unicode_ci;

カラムのcollateが変わったかどうか確認したい場合

show full columns from posts;

MySQLコマンドのスクリプトを作って一発で反映させる。

変更する必要があるカラムが20個ほどあったので、スクリプトを作って一発で反映します。

mysql_emoji.ddlを作成

use template_db;
alter table <tableA> modify body text character set utf8mb4 collate utf8mb4_unicode_ci;
alter table <tableB> modify body text character set utf8mb4 collate utf8mb4_unicode_ci;
alter table <tableC> modify body text character set utf8mb4 collate utf8mb4_unicode_ci;
alter table <tableD> modify body text character set utf8mb4 collate utf8mb4_unicode_ci;
…略
mysql -u <DB_USERNAME> -p -h <DB_HOST> < mysql_script.ddl

Railsのdatabase.ymlも修正を加える必要がある。

次のように修正しました。この変更が必要であることに気が付かずに数時間溶かしました...

default: &default
  adapter: mysql2
  charset: utf8mb4
  collation: utf8mb4_unicode_ci
  encoding: utf8mb4
  略

まとめ

絵文字を受け付けるには、MySQLのカラムの文字コードがutf8mb4である必要があります。RailsでAPIサーバーを実装している場合は、database.ymlの変更も必要です。

そもそも初めから絵文字を挿入できるように対応しておけば楽なので、あらかじめ絵文字が入りそうなカラムをutf8mb4に設定しておくと良さそうです。

採用情報はこちら
目次