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

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

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

提供: WordPress Codex 日本語版
2008年4月7日 (月) 21:04時点におけるNao (トーク)による版 (文字コード・照合順序の定義: バージョン 2.2 へのリンクを修正)

移動先: 案内検索

この項目「DB 文字コードセットの変換」は、翻訳チェック待ちの項目です。加筆、訂正などを通して、Codex ドキュメンテーションにご協力下さい。

この記事では、一般的に 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 の文字コードと照合順序を変換する方法については、以下で説明しています。

データベースの変換

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

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

問題点

文字コードを変換するには、MySQL の ALTER TABLE コマンドを使用する必要があります。文字コードを変換する際、すべての text フィールド(および類似フィールド)は UTF-8 に変換されますが、その際に保存されているテキストデータが破壊されてしまいます。これは、MySQL 側では返還前のデータが latin1 文字コードで保存されていることを前提にしているのですが、WordPress では 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_CHARSET と DB_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 のページにも英語フォーラムへのリンクなどがあります。

リソース