「😀」みたいな絵文字をMySQLに保存したい。
方法
my.cnf に以下を追記
「/etc/my.cnf」「/etc/mysql/my.cnf」あたりにあるはず。
※最後の3行は、MariaDB >= 10.3.1
ならデフォルトで設定されているので追記しなくてよい。
(設定自体が出来なくなってもいる。 参考)
my.cnf
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server = utf8mb4
skip-character-set-client-handshake
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init-connect = SET NAMES utf8mb4
innodb_file_format = Barracuda # MariaDB >= 10.3.1 なら削除
innodb_file_per_table = 1 # MariaDB >= 10.3.1 なら削除
innodb_large_prefix # MariaDB >= 10.3.1 なら削除
※AWSのRDSでこの設定をする場合はこちら。
database.ymlを変更
database.yml
# 変更前
encoding: utf8
↓
# 変更後
encoding: utf8mb4
charset: utf8mb4
collation: utf8mb4_unicode_ci
databaseを作成
bash
bundle exec rake db:create
bundle exec rake db:migrate
確認
bash
mysql # mysqlにログイン
mysql
use データベース名; # データベースを選択
show variables like 'character_set%'; # 文字コード表示
こんな風に表示されるはず。
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
追記(経験談)
AWSのproduction環境で上記設定をした時、database.ymlが反映されず、SQL発行時に「SET NAMES utf8」が出てしまい、絵文字が保存出来ないという状況が起きました。インスタンスを再起動してみたら直りました。
Capistranoを使っていて、「shared/config/」にdatabase.ymlを置いていたので、これが理由なのかなと思っています。
参考
https://qiita.com/okamu_/items/5eb81688849fbe351350
https://y-hilite.com/3192/