LoginSignup
17
28

More than 5 years have passed since last update.

データベースのutf8mb4対応

Posted at

普通に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_formatBarracudainnodb_large_prefix1にする部分が抜けており、これを忘れると後で詰まる。

変更用のスクリプト作成

やらなきゃいけないことが以下の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 ...
17
28
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
28