こんにちは!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に設定しておくと良さそうです。