MySQLの文字コード変更

MySQLを5.7から8へバージョンアップする過程で、文字コードを utf8mb4 に変更する必要が生じたため、方法をメモします。

現在の状況確認

↓まずMySQLに接続して、現在の状況を確認します。

# MySQLへ接続
mysql -u root -p

# 変更対象のDBを選択
mysql> use hogehoge;

# 文字の設定を管理している環境変数を表示
mysql> show variables like "chara%!"(MISSING);

# 出力結果
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

latin1で運用していたのか。。

デフォルトの設定変更

設定を帰るには、一度MySQLのコンソールから抜けて、 /etc/my.cnf を修正します。

vi /etc/my.cnf

# 下記を追記
[mysqld]
...
character-set-server=utf8mb4

[client]
default-character-set=utf8mb4

mysqld を再起動後、再度MySQLへ接続し、確認。

mysql> show variables like "chara%!"(MISSING);

# ↓出力結果
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

既存DBの場合の設定

character_set_databasecharacter_set_system が変更されていませんでした。 character_set_system は識別子を保存するための文字コードで、常にutf8とのこと(一次ソースが欲しい。。)。すでにDBとテーブルが存在する場合はもう一手間必要です。

↓character_set_databaseの修正

ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

↓既存テーブルの文字コード変換

ALTER TABLE table_name CONVERT TO character SET utf8mb4 COLLATE utf8mb4_unicode_ci;

↓既存カラムの文字コード変換

ALTER TABLE table_name CHANGE column_name column_name VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

まとめ

最終的に以下のようになりました。やったぜ!既存DBの修正は文字化けが起きたりもするので、バックアップをしっかりとって、安全な環境で実施しましょう!

mysql> show variables like "chara%!"(MISSING);
+--------------------------+----------------------------+
| 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/charsets/ |
+--------------------------+----------------------------+