• 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細

このWikiはいつでも誰でも編集できます

DB 文字コードセットの変換

提供: WordPress Codex 日本語版
移動先: 案内検索

このページ「DB 文字コードセットの変換」は 情報が古くなっている可能性があります。最新版英語)も合わせてご覧ください。最新に更新してくださる協力者を求めています

この記事では、一般的に WordPress の MySQL データベーステーブルを、ある文字コード(キャラクタセット)から別の文字コードに変換する方法について説明します。

注: 文字コードを変換する作業は簡単とはいえません。変換を試す前にデータベースのバックアップを完了させておきましょう。

WordPress バージョン 2.1.3 およびそれ以前のバージョンでは、ほとんどの WordPress データベースは latin1 の文字コードと latin1_swedish_ci照合順序で作成されていました。

文字コード・照合順序の定義

WordPress バージョン 2.2 以降では、ユーザーがデータベースの文字コードと照合順序を wp-config.php ファイル内で定義できるようになりました。wp-config.php ファイルの DB_CHARSETDB_COLLATE の値を編集することで、WordPress は適切な設定でデータベースを作成します。ただしこれは、すでにインストール済みの WordPress ではなく、新規インストールの場合のみに指定できるものです。インストール済みの WordPress の文字コードと照合順序を変換する方法については、以下で説明しています。

訳注: 2.1.3 以前に WordPress コアファイルに SET NAMES 'utf8' を挿入して運用していた場合は、その修正の替わりに DB_CHARSET 定義を使えます(同じ処理が行なわれます)。

データベースの変換

変換を始める前に、データベースのバックアップを必ず行ってください。データベースのバックアップ に、分かりやすい手順があります。

説明を単純にするため、ここでは文字コードが latin1 のデータベースを utf8 に変換するものとします。

問題点

文字コードを変換するには、MySQL の ALTER TABLE コマンドを使用する必要があります。文字コードを変換すると、すべての TEXT 型フィールド(および類似フィールド)が UTF-8 に変換されますが、その際に格納されているテキストデータが壊れてしまいます。これは、MySQL 側では変換前のデータが latin1 文字コードで保存されていることを前提にしているのですが、WordPress は(UTF-8 で動いているため) unicode の文字をデータベースに保存していることがあり、変換後に文字化けしてしまうのです。

解決策

この問題を回避するため、まずすべての TEXT 型および類似フィールドを、対応するバイナリのデータ型に ALTER コマンドを使って変換します。文字コードを変換した後、データ型を元に戻します。

作業例:

  1. ブログにメンテナンス中のお知らせを掲載
  2. データベースをバックアップ
  3. ALTER TABLE wp_users MODIFY display_name BLOB; を実行
  4. その他の全テーブルおよびカラムに ALTER TABLE コマンドを実行
  5. ALTER DATABASE wordpress charset=utf8; を実行
  6. ALTER TABLE wp_users charset=utf8; を実行
  7. その他の全テーブルに ALTER TABLE コマンドを実行
  8. ALTER TABLE wp_users MODIFY display_name TEXT CHARACTER SET utf8; を実行
  9. その他の全テーブルおよびカラムに ALTER TABLE コマンドを実行
  10. wp-config.php ファイルに DB_CHARSETDB_COLLATE の定義を追加
  11. メンテナンス中のお知らせを解除

文字列型フィールドは、対応するバイナリ型に変換しなくてはなりません。以下が対応表です。

  • CHAR -> BINARY
  • VARCHAR -> VARBINARY
  • TINYTEXT -> TINYBLOB
  • TEXT -> BLOB
  • MEDIUMTEXT -> MEDIUMBLOB
  • LONGTEXT -> LONGBLOB

この情報の原文は、英語フォーラムのスレッドNo.117955 に g30rg3x が投稿したものです。

ENUM 型と SET 型の変換ルール詳細

変換時に文字化けするような特殊文字が ENUM 型や SET 型フィールドに含まれていない事がはっきりしている場合、文字コードを UTF-8 に設定します。そうでない場合は、フィールドの型をまずバイナリに変換します。

このためのSQL文は次のとおりです。

ALTER TABLE wp_links CHANGE link_visible link_visible ENUM('Y','N') CHARACTER SET utf8;

項目名は ENUM 設定と同様に繰り返す必要があります。

BINARY 型または VARBINARY 型を指定する場合、元の CHAR や VARCHAR 型と同じフィールド長を指定する必要があります。例えば、VARCHAR(200)VARBINARY(200) とします。

つまり、上記の作業例の手順 3 と 4 では CHAR、VARCHAR、TEXT、ENUM、SET 型のフィールドを、BLOB、VARBINARY 型などの対応バイナリ型に変換します。そして手順 5~7 でデータベースを utf8 に切り替え、手順 8 と 9 で最初に変換した項目タイプを元のタイプに戻すのです。

変換の鍵となるのは、バイナリデータ型のフィールドは、データベースやテーブルを utf8 に切り替えても、CHAR、VARCHAR、TEXT、ENUM、SET 型のフィールドのようには文字化けしないという事です。

変換プラグイン

g30rg3_x の作成した UTF-8 Database Converter というプラグインがあります。利用する場合は、同梱の Readme ファイルをしっかり読みましょう。

文字コードに関する話題

以下に加え、このページの原文である Codex のページにも英語フォーラムへのリンクなどがあります。

参考資料

最新英語版: WordPress Codex » Converting Database Character Sets最新版との差分