あるDBの言語設定を確認してみるとlatin1で設定されていて、言語設定を変える必要に迫られた。
既存DBだと変更箇所は複数に及ぶので、変更ポイントをメモ。
言語設定の確認
mysql> show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | laten1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
自分の環境は上記のような感じになっていた。データベースとサーバーのキャラセットがlaten1になっていた。ここを変更する。
構成ファイルの変更
今回はLinuxだったので/etc/my.cnfを変更した。mysqldとclientのそれぞれのセクションに書く。なお、mysqldのセクションに書いておくだけで良い場合もあるので、そこはmysqlのバージョンによっても変わる。
[mysqld]
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
変更したあとはmysqldの再起動を忘れずにする。
既存のDB、テーブル、カラムの文字コードを変更
既存DBの場合は設定ファイル変えてもだめで、ALTER DATABASEで設定を変えてやる。
文字コードをutf8に変える場合は以下のような感じ。
ALTER DATABASE データベース名 CHARACTER SET utf8 COLLATE utf8_general_ci;
既存テーブルの文字コードと照合順序の変更
ALTER TABLE テーブル名 CONVERT TO character SET utf8 COLLATE utf8_general_ci;
既存カラムの文字コードと照合順序変更
ALTER TABLE テーブル名 MODIFY COLUMN カラム名 varchar(10) COLLATE utf8_general_ci;
余談:照合順序の違い
自分があたった事例だとutf8mb4使っているときに気になったことがあった。MySQL5.7だとデフォルトのcollationの設定がutf8mb4_general_ciになっている。MySQL8だと新しくutf8mb4_0900_ai_ciが採用されているので、8系と5系ではこの部分でずれが生じる。
5系に合わせる必要があるのであれば、utf8mb4_general_ciなど5系で使えるcollationを使うことになる。このあたりはバージョンアップ等をする際には気をつけておかないと、後々に予期せぬ文字列の比較を行っていたなど問題になるかもしれない。