世界のことを知りたい

読書習慣を付けたい。…マンガも本だよね?

さくらのレンタルサーバーの MySQL で utf8mb4 を使う。Wordpress の設定も

昨日「ファイアバード」で MySQL に utf8mb4 が使えないという話を書いたところなのですが、早速さくらインターネットでレンタルサーバーを借りて、utf8mb4 が使えるか試してみました。

utf8mb4 が使えると難しい漢字や絵文字を使えます。Wordpress 4.2 以降は何もしなくても絵文字を置き換えてうまく表示する機能があります。さすがですね。

環境に関わらず絵文字を使える良い機能ですが、今回は文字セットを utf8mb4 にするのでその機能が必要なくなります。

色々を調べながらデータベースを utf8mb4 に何とかできたのでその方法を書いておきます。Wordpress を utf8mb4 で使う際に必要な設定も載せておきます。

MySQL を Version 5.5 以降にする

utf8mb4 に対応した MySQL は 5.5 以降です。サーバーの設定(コントロールパネル)で、MySQL の 5.5 を使っているか確認しましょう。それ以前のバージョンを使っている場合、さくらのレンタルサーバーでは確かデータベースを一度全部削除すると MySQL のバージョンを選べるようになると思います。

もし新しくデータベースを作るなら、文字セットに utf8mb4 が選べない場合、UTF8 にしておきましょう。変換が楽なので。

私は UTF8 から utf8mb4 にしたので、この他の文字セットからの変換の苦労は体験していません。検索するとすぐに情報が見つかりますので、もし既存のデータベースの文字セットが EUC-JP や SJIS なら、他のサイトを見て変換した方が良さそうです。

管理ツールへログイン

それでは管理ツール(phpMyAmin)へログインします。データベースを弄り慣れている人は別に phpMyAdmin を使わなくても構いません。

データベースの文字セットを utf8mb4 に

SQL を使いたいのでそのタブをクリックします。phpMyAdmin のバージョンにもよると思いますが、だいたいこのあたりにあります。

f:id:arityk:20151025002930j:plain

テキストボックスが出るのでそこに

ALTER DATABASE `データベース名` DEFAULT CHARACTER SET utf8mb4;

と入力します。「データベース名」は自分のデータベース名にしてください。データベース名をくくっている文字は、日本語キーボードだと「SHIFT+@」で入力する「`」です。

f:id:arityk:20151025003022j:plain

同時に照合順序も決めたいときは

ALTER DATABASE `データベース名` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

などとしてください。general_ci と unicode_ci のどちらにしたら良いのかは下の説明を読んで、自分の用途に合った方をどうぞ。

【MySQL】照合順序とは? - Qiita

utf8_general_ciとutf8_unicode_ciの使い分け

mysqlのデフォルトはutf8_general_ciとなる。
utf8_unicode_ciの方があいまい検索可能だが、少し遅いとのことらしい。

utf8_general_ci
アルファベットの大文字・小文字は区別せずにマッチする。
ただし、区別しない文字は、半角は半角の大文字・小文字、全角は全角の大文字・小文字のみ。
半角小文字と全角小文字同士はマッチしない。

utf8_unicode_ci
下記がマッチする。
アルファベットの大文字・小文字(全半角混合)
ひらがなの大文字・小文字とカタカナの大文字・小文字 (例えば、'あ'で検索すると、'ぁ', 'ア', 'ァ'もマッチする)

これで右下のボタンで実行します。これが成功すればデータベースの文字セットが utf8mb4 になっています。

ボタンを押すとすぐに実行が終わり、本当に utf8mb4 になったか不安なので確認してみます。これを確認するにはデータベースを「information_schema」に切り替え、「SCHEMATA」テーブルを見れば OK です。

f:id:arityk:20151025003205j:plain

自分のデータベース名があるレコードを見つけ、「DEFAULT_CHARACTER_SET_NAME」が「utf8mb4」になっていれば成功です。

既存のテーブルを utf8mb4 に変換

(ここは新たにデータベースを作った人には関係の無い話です。その場合は読み飛ばしても構いません。)

上のコマンドは文字セットのデフォルトを utf8mb4 にしただけです。これまでに作ったテーブルは以前の文字セットのままです。

では既存のテーブルを utf8mb4 に変換しましょう。utf8 から utf8mb4 へは何の問題も無く変換可能とのことです。

上でやったように作ったデータベースを開き、SQL コマンドのテキストボックスを出します。今度は下のように入力します。

ALTER TABLE `テーブル名` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

ALTER TABLE というコマンドでは複数のテーブルを一度で変換させることはできないようです。面倒ですが、既存のテーブル名をずらっと書き出すのが早そうです。

Wordpress のデータベースの人は通常の設定なら下のコマンドをコピー&ペーストして使えるはずです。照合順序は好きなように変えてください。

ALTER TABLE `wp_commentmeta` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `wp_comments` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `wp_links` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `wp_options` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `wp_postmeta` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `wp_posts` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `wp_terms` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `wp_term_relationships` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `wp_term_taxonomy` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `wp_usermeta` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `wp_users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

これで既存のテーブルも utf8mb4 に変換されました。変換されたか確認したいなら「information_schema」の「TABLES」から目的のテーブルを探して見て下さい。

Wordpress を utf8mb4 へ

データベースの変換が終わったので、最後に Wordpress が utf8mb4 を使うように設定します。もちろん Wordpress を使っていない人には関係のない話です。

Wordpress のインストール先に wp-config.php があります。Wordpress をインストールしたときにこれを編集したと思います。これを開き、次のように変えます。

define('DB_CHARSET', 'utf8mb4');

DB_CHARSET が UTF8 などになっていると思いますので、これを utf8mb4 にします。これで OK です。

間違えてやってしまったところ

Wordpress の wp_options を見ていたら次のレコードを見つけてしまいました。

f:id:arityk:20151025003216j:plain

"blog_charset"。怪しげです。ここも弄っておいた方が良いのかな…?

これも utf8mb4 にしてみたのですが、不具合が見つかりました。Wordpress の管理者画面の「投稿一覧」で投稿を検索するとき、これが utf8mb4 になっていると検索できません。

検索ボックスに「あああ」と入れて検索してみても、「"" の検索結果」と出てしまい、検索文字列がうまく渡されていないようです。ここはそのまま UTF-8 の方が良さそうです。ここに関する情報を知っていたら教えてください。

終わり

これでたぶん utf8mb4 に切り替わっていると思います。絵文字などをデータベースに入れて試してみてください。上で書いたように Wordpress は絵文字は置き換えてくれる機能があるので分かりにくいかも知れません。こちらのプラグインでその機能を切れます。

ちなみにさくらインターネットの phpMyAdmin はグローバルの文字セットの設定に従って utf8 なので、このツールで utf8mb4 の文字を入れると文字化けします。

それにしてもさくらインターネットのレンタルサーバーは有り難いですね。MySQL のバージョンが新しくて助かりました。