【WordPress】MySQLの文字コードをutf8mb4に変換

Pexels photo 1148820

WordPressのデータを格納しているMySQLデータベースの文字コードをutf8からutf8mb4に変換した。

MySQLのutf8は3バイト文字にしか対応しておらず、絵文字を保存するためには比較的最近追加された4バイト文字対応のutf8mb4を使用する必要がある。

WordPress側にはデータベースの文字コードを変換する機能はないので、mysqlコマンドで対応しなければならない。

alter tableで対応

最初に既存のデータベースの内容を保存しておく。mysqldumpが使えるならそれが確実。

次に、以下のような内容をファイルに保存する(utf8mb4.sql)

alter table `wp_commentmeta` convert to character set utf8mb4 collate utf8mb4_unicode_520_ci;
alter table `wp_comments` convert to character set utf8mb4 collate utf8mb4_unicode_520_ci;
alter table `wp_links` convert to character set utf8mb4 collate utf8mb4_unicode_520_ci;
alter table `wp_options` convert to character set utf8mb4 collate utf8mb4_unicode_520_ci;
alter table `wp_postmeta` convert to character set utf8mb4 collate utf8mb4_unicode_520_ci;
alter table `wp_posts` convert to character set utf8mb4 collate utf8mb4_unicode_520_ci;
alter table `wp_term_relationships` convert to character set utf8mb4 collate utf8mb4_unicode_520_ci;
alter table `wp_term_taxonomy` convert to character set utf8mb4 collate utf8mb4_unicode_520_ci;
alter table `wp_termmeta` convert to character set utf8mb4 collate utf8mb4_unicode_520_ci;
alter table `wp_terms` convert to character set utf8mb4 collate utf8mb4_unicode_520_ci;
alter table `wp_usermeta` convert to character set utf8mb4 collate utf8mb4_unicode_520_ci;
alter table `wp_users` convert to character set utf8mb4 collate utf8mb4_unicode_520_ci;

ファイルをデータベースサーバーへファイルを転送し、以下のコマンドを実行する。

mysql WordPressデータベース名 < utf8mb4

しばらく待てば正常に完了するはず(日付関連のエラーの対処は後述)。

仕組みは簡単でWordPressの各テーブルの文字コードをutf8mb4に変換しているだけ。collateに関しては明確な指針がみつからなかったので、WordPressを新規セットアップしたときに使われているutf8mb4_unicode_520_ciを指定してみた(古いMySQLサーバーだと指定できないかも。ここではMySQL 8以降を想定しています)。

utf8mb4_unicode_520_ciには特定の文字を区別できない問題があるらしいけど、とりあえず正常に動作している模様。

日付関連のカラムが原因でエラーが発生した場合

日付関連のカラムが原因でエラー(ゼロが登録できないとかそういうやつ)が発生した場合はMySQLサーバーのsql_modeを変更する。

mysqlコマンドを実行し、以下の内容を実行する。

show variables like 'sql_mode' ; 

“NO_ZERO_IN_DATE,NO_ZERO_DATE”が含まれていたら以下を実行。ちなみにset globalで設定した値はサーバーを再起動したら元に戻るが、alter table実行時にだけ設定が変わっていれば良いのでむしろ好都合か。

set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

このあと先ほどのutf8mb4.sqlを実行する。

まとめ

WordPressのデータを格納しているMySQLデータベースの文字コードを変換する場合、mysqlコマンドを使うのが一番確実。