WordPress・データベースの日本語が文字化けしたときの直し方

サーバー移行や更新、エクスポートのあと、記事の日本語が「縺薙s」のような文字列になっていませんか。データ自体は残っていることがほとんどで、読み取りの文字コードが違うだけです。Mojibuster でエクスポートを修復し、そのあとデータベース側の原因を直します。

テキストと次のファイルに対応:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Excel の CSV、データベースのダンプ、字幕、Web サイトのコードなど。

修正する

  1. ファイルをドロップ、またはテキストを貼り付け
  2. 自動で修正
  3. コピーまたはダウンロード
またはファイルをここにドラッグ
  • アップロードなし。 ファイルはブラウザー内で修正され、端末の外に出ることはありません。

  • EU 内のサーバー。 Mojibuster は フィンランド(EU)のサーバーで運用しており、EU 一般データ保護規則(GDPR)が適用されます。 GDPR の条文(EUR-Lex、英語)

どんな症状か

サーバー移行後の SQL ダンプの1行

変換前

INSERT INTO wp_posts (post_title) VALUES ('縺薙s縺ォ縺。縺ッ 譌・譛ャ');

変換後

INSERT INTO wp_posts (post_title) VALUES ('こんにちは 日本');

原因はどこにあるか

WordPress は文字を UTF-8 で保存します。ところが古いサイトには、テーブルが latin1 で作られていたり、latin1 で接続していたりするものがあります。書き込みと読み出しで同じ間違いをしている間は気づきません。新しいサーバーへの移行、phpMyAdmin でのエクスポート、接続文字コードの変更をきっかけに、日本語が一斉に化けます。

  • wp-config.php の DB_CHARSET が latin1 になっている、またはテーブルと合っていない。
  • ダンプを latin1 で書き出し utf8mb4 で取り込んだ(またはその逆)。
  • プラグインやインポート用スクリプトが、すでに化けたテキストをもう一度変換した。これが二重の文字化けです。

エクスポートを修復する

  1. 何かを変更する前に、データベースのバックアップを取ります。
  2. 対象のテーブルを .sql ファイルでエクスポートします。phpMyAdmin のほか、mysqldump --default-character-set=utf8mb4 でも可能です。
  3. 上のボックスにファイルをドロップします。Mojibuster は壊れた部分だけを直し、変更点をすべて表示します。
  4. 修復したファイルをダウンロードし、utf8mb4 で新しいテスト用データベースに取り込みます。
  5. サイトの表示を確認し、問題なければ本番のデータベースに取り込みます。

ダンプはアップロードされません。ダンプにはユーザーアカウント、メールアドレス、コメントが含まれるため、これは重要な点です。

シリアライズされたデータに注意

WordPress は一部の設定を wp_options や wp_postmeta に、s:6:"日本"; のような PHP のシリアライズ形式で保存します。数字は文字数ではなくバイト数です。化けた文字を元に戻すと長さが合わなくなり、WordPress はその値を破棄します。そのため、まず wp_posts、wp_comments、wp_terms などの本文系テーブルを修復してください。オプション類は、長さも更新してくれる WP-CLI の wp search-replace が適しています。

MySQL 側で原因を直す

  • テーブルと接続を utf8mb4 に切り替え、wp-config.php に define('DB_CHARSET', 'utf8mb4'); を設定します。
  • latin1 の列に UTF-8 のバイト列が入っている場合、そのまま変換してはいけません。もう一度エンコードされてしまいます。一般的には、まず MODIFY … LONGBLOB、次に MODIFY … LONGTEXT CHARACTER SET utf8mb4 とバイナリ型を経由します。
  • すべての変更は、まずデータベースのコピーで試してください。

よくある質問

WordPress のデータベース全体を一度に直せますか?

はい、大きな SQL ダンプでも処理できます。ただし wp_options や wp_postmeta のシリアライズデータには注意が必要で、WP-CLI のほうが向いています。

ダンプ内の正しい文字が変わることはありますか?

ありません。Mojibuster は明らかに壊れた並びだけを修復し、正しい文字はそのまま残します。

utf8 と utf8mb4 の違いは何ですか?

MySQL の utf8 は最大3バイトまでの文字しか保存できず、絵文字などが失われます。utf8mb4 が本来の UTF-8 で、WordPress にはこちらが適切です。

WordPress 以外でも使えますか?

はい。Joomla、Drupal、Magento、MySQL や MariaDB 上の自社システムでも、同じ問題と同じ対処法が当てはまります。

関連ガイド