普通にMySQL使ってると、絵文字が使えなかったりして辛い時がある。これは文字コードをutf8mb4にすることで解決できる。
Mac側の対応
HomebrewでMySQLを入れた場合、次のような手順になる。
まず、my.cnfを作ったことがなければ、デフォルトのを探してコピーしてくる。
$ find /usr/local/Cellar/mysql -name "my*.cnf"
/usr/local/Cellar/mysql/5.6.24/support-files/my-default.cnf
$ cp /usr/local/Cellar/mysql/5.6.24/support-files/my-default.cnf /usr/local/etc/my.cnf
以下のように編集してMySQLを再起動する。
$ vi /usr/local/etc/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
innodb_file_per_table = 1
innodb_large_prefix
具体的に何をやっているかは、mysql utf8mb4
とかでググると出てくるので調べる。
AWS RDSの対応
本番環境でAWS RDSを使っている場合も、同様のことをやる。クラスメソッドさんの記事などが参考になる。
ただし、innodb_file_format
をBarracuda
、innodb_large_prefix
を1
にする部分が抜けており、これを忘れると後で詰まる。
変更用のスクリプト作成
やらなきゃいけないことが以下の4種類あるので、それぞれ実行していく。
- データベースのCHARACTER SETの変更
- テーブルのROW FORMATの変更
- テーブルのCHARACTER SETの変更
- text型のカラムが自動的にmediumtext型になってしまうのでtext型に戻す
テーブルロックに注意。巨大なテーブル等の変更には工夫が必要。
ALTER DATABASE database_name CHARACTER SET utf8mb4;
ALTER DATABASE database_name COLLATE utf8mb4_general_ci;
ALTER TABLE table_name ROW_FORMAT=DYNAMIC;
ALTER TABLE table_name2 ROW_FORMAT=DYNAMIC;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4;
ALTER TABLE table_name2 CONVERT TO CHARACTER SET utf8mb4;
ALTER TABLE table_name MODIFY COLUMN text text;
ワンライナーは以下のようになる。ただし、これだと最後のALTER TABLE table_name MODIFY COLUMN text text;
などはカバーしきれない。mediumtext
で問題がある場合は別途、対応した方が良い。
(mysql -uroot -p <DATABASE_NAME> -e "show tables" --batch --skip-column-names | xargs -I{} echo 'alter table `'{}'` convert to character set utf8mb4;') > /tmp/alters.sql
cat /tmp/alters.sql | mysql -uroot -p ...