- 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細)
DB 文字コードセットの変換
このページ「DB 文字コードセットの変換」は 情報が古くなっている可能性があります。最新版(英語)も合わせてご覧ください。最新に更新してくださる協力者を求めています。
この記事では、一般的に WordPress の MySQL データベーステーブルを、ある文字コード(キャラクタセット)から別の文字コードに変換する方法について説明します。
注: 文字コードを変換する作業は簡単とはいえません。変換を試す前にデータベースのバックアップを完了させておきましょう。
目次
これまでの背景
WordPress バージョン 2.1.3 およびそれ以前のバージョンでは、ほとんどの WordPress データベースは latin1 の文字コードと latin1_swedish_ci の照合順序で作成されていました。
文字コード・照合順序の定義
WordPress バージョン 2.2 以降では、ユーザーがデータベースの文字コードと照合順序を wp-config.php
ファイル内で定義できるようになりました。wp-config.php
ファイルの DB_CHARSET
と DB_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
コマンドを使って変換します。文字コードを変換した後、データ型を元に戻します。
作業例:
- ブログにメンテナンス中のお知らせを掲載
- データベースをバックアップ
-
ALTER TABLE wp_users MODIFY display_name BLOB;
を実行 - その他の全テーブルおよびカラムに
ALTER TABLE
コマンドを実行 -
ALTER DATABASE wordpress charset=utf8;
を実行 -
ALTER TABLE wp_users charset=utf8;
を実行 - その他の全テーブルに
ALTER TABLE
コマンドを実行 -
ALTER TABLE wp_users MODIFY display_name TEXT CHARACTER SET utf8;
を実行 - その他の全テーブルおよびカラムに
ALTER TABLE
コマンドを実行 - wp-config.php ファイルに
DB_CHARSET
とDB_COLLATE
の定義を追加 - メンテナンス中のお知らせを解除
文字列型フィールドは、対応するバイナリ型に変換しなくてはなりません。以下が対応表です。
- 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 のページにも英語フォーラムへのリンクなどがあります。
- http://trac.wordpress.org/ticket/2828 (en)
- http://trac.wordpress.org/ticket/2942 (en)
- http://trac.wordpress.org/ticket/3184 (en)
- http://trac.wordpress.org/ticket/3517 (en)
- http://trac.wordpress.org/ticket/4219 (en)
- http://comox.textdrive.com/pipermail/wp-testers/2007-May/004510.html (en)
- Making your Wordpress database portable (because it probably isn’t right now…) (en)
- WordPress 日本語フォーラム「文字コード」タグ
参考資料
- Wikipedia: 文字コード
- Wikipedia: Unicode
- Wikipedia: UTF-8
- MySQL 5.1 リファレンスマニュアル
- MySQL 4.1 リファレンスマニュアル
- 各国キャラクタセットと Unicode
- カラム型
- BLOB 型と TEXT 型 (文字列型のバイナリ)
- ALTER TABLE 構文
- 上記以外の MySQL バージョンの日本語マニュアル(日本MySQLユーザ会)
- 日本MySQLユーザ会 (MyNA) » FAQ » 4.1以上の壁 (日本語の扱いの違い、文字化け等/含む5.0以上)
- Gentoo tip on converting latin1 to utf8 in MySQL (en)
- Alex King's blog about latin1 to utf8 conversion (en)
最新英語版: WordPress Codex » Converting Database Character Sets (最新版との差分)