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

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

「DB 文字コードセットの変換」の版間の差分

提供: WordPress Codex 日本語版
移動先: 案内検索
(文字コード・照合順序の定義: バージョン 2.2 へのリンクを修正)
(体裁・用語微調整、参考リンク追加。ノート参照。)
1行目: 1行目:
 
{{CheckTrans}}
 
{{CheckTrans}}
  
この記事では、一般的に WordPress の [[用語集#MySQL|MySQL]] [[Database Description|データベーステーブル]]を、ある[[用語集#文字コード|文字コード]]から別の文字コードに変換する方法について説明します。
+
この記事では、一般的に WordPress の [[用語集#MySQL|MySQL]] [[データベース概要|データベーステーブル]]を、ある[[用語集#Character set|文字コード]](キャラクタセット)から別の文字コードに変換する方法について説明します。
  
 
'''注: 文字コードを変換する作業は簡単とはいえません。変換を試す前にデータベースのバックアップを完了させておきましょう。'''
 
'''注: 文字コードを変換する作業は簡単とはいえません。変換を試す前にデータベースのバックアップを完了させておきましょう。'''
  
 +
<div id="The_History">
 
==これまでの背景==
 
==これまでの背景==
WordPress バージョン 2.1.3 およびそれ以前のバージョンでは、ほとんどの WordPress データベースは ''latin1'' の文字コードと ''latin1_swedish_ci'' の[[用語集#照合順序|照合順序]] で作成されていました。
+
</div>
 +
WordPress [[:en:Version 2.1.3|バージョン 2.1.3]] およびそれ以前のバージョンでは、ほとんどの WordPress データベースは ''latin1'' の文字コードと ''latin1_swedish_ci'' の[[用語集#照合順序|照合順序]]で作成されていました。
  
 +
<div id="Character_set_and_collation_can_now_be_defined">
 
==文字コード・照合順序の定義==  
 
==文字コード・照合順序の定義==  
WordPress では[[Version_2.2|バージョン 2.2]] 以降、ユーザーがデータベースの文字コードと照合順序を [[wp-config.php_の編集|wp-config.php]] ファイル内で定義できるようになりました。''wp-config.php'' ファイルの[[wp-config.php_の編集#データベース・キャラクタセット|DB_CHARSET]] と [[wp-config.php_の編集#データベース照合順序|DB_COLLATE]] の値を編集することで、WordPress は適切な設定でデータベースを作成します。ただしこれは、すでにインストール済みの WordPress ではなく、新規インストールの場合のみに指定する事ができるものです。インストール済みの WordPress の文字コードと照合順序を変換する方法については、以下で説明しています。
+
</div>
 +
WordPress [[Version 2.2|バージョン 2.2]] 以降では、ユーザーがデータベースの文字コードと照合順序を [[wp-config.php の編集|<code>wp-config.php</code>]] ファイル内で定義できるようになりました。''<code>wp-config.php</code>'' ファイルの [[wp-config.php の編集#データベース・キャラクタセット|<code>DB_CHARSET</code>]] と [[wp-config.php_の編集#データベース照合順序|<code>DB_COLLATE</code>]] の値を編集することで、WordPress は適切な設定でデータベースを作成します。ただしこれは、すでにインストール済みの WordPress ではなく、新規インストールの場合のみに指定できるものです。インストール済みの WordPress の文字コードと照合順序を変換する方法については、以下で説明しています。
  
 +
訳注: 2.1.3 以前に WordPress コアファイルに <code>SET NAMES 'utf8'</code> を挿入して運用していた場合は、その修正の替わりに <code>DB_CHARSET</code> 定義を使えます(同じ処理が行なわれます)。
 +
 +
<div id="Converting_your_database">
 
==データベースの変換==
 
==データベースの変換==
変換を始める前に、データベースのバックアップを必ず行ってください。[[Backing_up_your_database|Backing Up Your Database]] に、分かりやすい手順があります。
+
</div>
 +
変換を始める前に、データベースのバックアップを必ず行ってください。[[Backing up your database|データベースのバックアップ]] に、分かりやすい手順があります。
  
 
説明を単純にするため、ここでは文字コードが '''latin1''' のデータベースを '''utf8''' に変換するものとします。
 
説明を単純にするため、ここでは文字コードが '''latin1''' のデータベースを '''utf8''' に変換するものとします。
  
===問題点===
+
<div id="The_Problem">
文字コードを変換するには、MySQL の ALTER TABLE コマンドを使用する必要があります。文字コードを変換する際、すべての text フィールド(および類似フィールド)は UTF-8 に変換されますが、その際に保存されているテキストデータが破壊されてしまいます。これは、MySQL 側では返還前のデータが latin1 文字コードで保存されていることを前提にしているのですが、WordPress では unicode の文字をデータベースに保存してしまっていることがあるからです。
+
===問題点===  
 +
</div>
 +
文字コードを変換するには、MySQL の <code>ALTER TABLE</code> コマンドを使用する必要があります。文字コードを変換すると、すべての TEXT 型フィールド(および類似フィールド)が UTF-8 に変換されますが、その際に格納されているテキストデータが壊れてしまいます。これは、MySQL 側では変換前のデータが latin1 文字コードで保存されていることを前提にしているのですが、WordPress は(UTF-8 で動いているため) unicode の文字をデータベースに保存していることがあり、変換後に文字化けしてしまうのです。
  
 +
<div id="The_Solution">
 
===解決策===
 
===解決策===
この問題を解決するには、まずすべての TEXT および類似項目を、 ALTER コマンドを使って対応したバイナリの項目タイプに変換します。文字コードを変換後、項目タイプを元に戻すとよいでしょう。
+
</div>
 +
この問題を回避するため、まずすべての TEXT 型および類似フィールドを、対応するバイナリのデータ型に <code>ALTER</code> コマンドを使って変換します。文字コードを変換した後、データ型を元に戻します。
  
 
作業例:
 
作業例:
 
# ブログにメンテナンス中のお知らせを掲載
 
# ブログにメンテナンス中のお知らせを掲載
 
# データベースをバックアップ
 
# データベースをバックアップ
# ALTER TABLE wp_users MODIFY display_name BLOB; を実行
+
# <code>ALTER TABLE wp_users MODIFY display_name BLOB;</code> を実行
# その他のテーブルおよび列に ALTER TABLE コマンドを実行
+
# その他の全テーブルおよびカラムに <code>ALTER TABLE</code> コマンドを実行
# ALTER DATABASE wordpress charset=utf8; を実行
+
# <code>ALTER DATABASE wordpress charset=utf8;</code> を実行
# ALTER TABLE wp_users charset=utf8; を実行
+
# <code>ALTER TABLE wp_users charset=utf8;</code> を実行
# その他のテーブルに ALTER TABLE コマンドを実行
+
# その他の全テーブルに <code>ALTER TABLE</code> コマンドを実行
# ALTER TABLE wp_users MODIFY display_name TEXT CHARACTER SET utf8; を実行
+
# <code>ALTER TABLE wp_users MODIFY display_name TEXT CHARACTER SET utf8;</code> を実行
# その他のテーブルおよび列に ALTER TABLE コマンドを実行
+
# その他の全テーブルおよびカラムに <code>ALTER TABLE</code> コマンドを実行
# [[wp-config.php_の編集|wp-config.php]] ファイルに DB_CHARSET と DB_COLLATE の定義を追加
+
# [[wp-config.php_の編集|wp-config.php]] ファイルに <code>DB_CHARSET</code> <code>DB_COLLATE</code> の定義を追加
 
# メンテナンス中のお知らせを解除
 
# メンテナンス中のお知らせを解除
  
文字列の項目タイプは、対応するバイナリの項目タイプに変換しなくてはなりません。以下が対応表です。
+
文字列型フィールドは、対応するバイナリ型に変換しなくてはなりません。以下が対応表です。
 
* CHAR -> BINARY
 
* CHAR -> BINARY
 
* VARCHAR -> VARBINARY
 
* VARCHAR -> VARBINARY
45行目: 57行目:
 
この情報の原文は、[http://wordpress.org/support/topic/117955 英語フォーラムのスレッドNo.117955] に g30rg3x が投稿したものです。
 
この情報の原文は、[http://wordpress.org/support/topic/117955 英語フォーラムのスレッドNo.117955] に g30rg3x が投稿したものです。
  
==== ENUM SET の変換ルール詳細 ====
+
==== ENUM 型と SET 型の変換ルール詳細 ====
ENUM または SET フィールドに変換時に文字化けするような特殊文字が含まれていない事がはっきりしている場合、文字コードを UTF-8 に設定します。そうでない場合は、項目タイプをまずバイナリに変換します。
+
変換時に文字化けするような特殊文字が ENUM 型や SET 型フィールドに含まれていない事がはっきりしている場合、文字コードを UTF-8 に設定します。そうでない場合は、フィールドの型をまずバイナリに変換します。
  
このためのSQL文は以下の通りです。
+
このためのSQL文は次のとおりです。
  
 
  ALTER TABLE wp_links CHANGE link_visible link_visible ENUM('Y','N') CHARACTER SET utf8;
 
  ALTER TABLE wp_links CHANGE link_visible link_visible ENUM('Y','N') CHARACTER SET utf8;
  
 +
<!-- The field name does need to be repeated, as well as the ENUM specification. -->
 
項目名は ENUM 設定と同様に繰り返す必要があります。
 
項目名は ENUM 設定と同様に繰り返す必要があります。
  
BINARY または VARBINARY を指定する場合、CHAR や VARCHAR の元の値と同じ項目の長さを指定する必要があります。例えば、VARCHAR(200) は VARBINARY(200) とします。
+
BINARY 型または VARBINARY 型を指定する場合、元の CHAR や VARCHAR 型と同じフィールド長を指定する必要があります。例えば、<code>VARCHAR(200)</code> <code>VARBINARY(200)</code> とします。
+
つまり、上記の作業例のステップ3と4では CHAR、VARCHAR、TEXT、ENUM、SET の項目タイプを、BLOB、VARBINARY などの対応バイナリ項目タイプに変換します。そしてステップ5〜7でデータベースを utf8 にスイッチし、ステップ8と9で最初に変換した項目タイプを元のタイプに戻すのです。
+
  
変換でキーとなるのは、バイナリデータタイプの項目は、データベースやテーブルを utf8 に変換しても CHAR、VARCHAR、TEXT、ENUM、SET 等の項目のようには文字化けしないという事です。
+
つまり、上記の作業例の手順 3 と 4 では CHAR、VARCHAR、TEXT、ENUM、SET 型のフィールドを、BLOB、VARBINARY 型などの対応バイナリ型に変換します。そして手順 5~7 でデータベースを utf8 に切り替え、手順 8 と 9 で最初に変換した項目タイプを元のタイプに戻すのです。
  
 +
変換の鍵となるのは、バイナリデータ型のフィールドは、データベースやテーブルを utf8 に切り替えても、CHAR、VARCHAR、TEXT、ENUM、SET 型のフィールドのようには文字化けしないという事です。
 +
 +
<div id="Conversion_Scripts_and_Plugins">
 
====変換プラグイン====
 
====変換プラグイン====
 +
</div>
 
g30rg3_x の作成した [http://g30rg3x.com/utf8-database-converter/ UTF-8 Database Converter] というプラグインがあります。利用する場合は、同梱の Readme ファイルをしっかり読みましょう。
 
g30rg3_x の作成した [http://g30rg3x.com/utf8-database-converter/ UTF-8 Database Converter] というプラグインがあります。利用する場合は、同梱の Readme ファイルをしっかり読みましょう。
  
 +
<div id="Discussions on character sets">
 
==文字コードに関する話題==
 
==文字コードに関する話題==
以下に加え、このページの原文である [[:en:Converting_Database_Character_Sets|Codex のページ]]にも英語フォーラムへのリンクなどがあります。
+
</div>
 +
以下に加え、このページの原文である [[:en:Converting Database Character Sets|Codex のページ]]にも英語フォーラムへのリンクなどがあります。
  
 
*http://trac.wordpress.org/ticket/2828 (en)
 
*http://trac.wordpress.org/ticket/2828 (en)
75行目: 92行目:
 
*[http://ja.forums.wordpress.org/tags.php?tag=文字コード WordPress 日本語フォーラム「文字コード」タグ]
 
*[http://ja.forums.wordpress.org/tags.php?tag=文字コード WordPress 日本語フォーラム「文字コード」タグ]
  
==リソース==
+
<div id="Resources">
 +
== 参考資料 ==
 +
</div>
 
*[http://ja.wikipedia.org/wiki/文字コード Wikipedia: 文字コード]
 
*[http://ja.wikipedia.org/wiki/文字コード Wikipedia: 文字コード]
 
*[http://ja.wikipedia.org/wiki/Unicode Wikipedia: Unicode]
 
*[http://ja.wikipedia.org/wiki/Unicode Wikipedia: Unicode]
*[http://ja.wikipedia.org/wiki/UTF-8 Wikipedia: 文字コード]
+
*[http://ja.wikipedia.org/wiki/UTF-8 Wikipedia: UTF-8]
*[http://dev.mysql.com/doc/refman/5.1/ja/charset-general.html 一般のキャラクタセットおよび照合順序(MySQLドキュメンテーション)]
+
* MySQL 5.1 リファレンスマニュアル
*[http://dev.mysql.com/doc/refman/5.1/ja/charset-charsets.html MySQL でサポートされるキャラクタセットと照合順序(MySQLドキュメンテーション)]
+
** [http://dev.mysql.com/doc/refman/5.1/ja/charset-general.html 一般のキャラクタセットおよび照合順序]
 +
** [http://dev.mysql.com/doc/refman/5.1/ja/charset-charsets.html MySQL でサポートされるキャラクタセットと照合順序]
 +
** [http://dev.mysql.com/doc/refman/5.1/ja/data-types.html データタイプ]
 +
** [http://dev.mysql.com/doc/refman/5.1/ja/blob.html BLOBとTEXT タイプ] (文字列型のバイナリ)
 +
** [http://dev.mysql.com/doc/refman/5.1/ja/alter-table.html ALTER TABLE 構文]
 +
* MySQL 4.1 リファレンスマニュアル
 +
** [http://dev.mysql.com/doc/refman/4.1/ja/charset.html 各国キャラクタセットと Unicode]
 +
** [http://dev.mysql.com/doc/refman/4.1/ja/column-types.html カラム型]
 +
** [http://dev.mysql.com/doc/refman/4.1/ja/blob.html BLOB 型と TEXT 型] (文字列型のバイナリ)
 +
** [http://dev.mysql.com/doc/refman/4.1/ja/alter-table.html ALTER TABLE 構文]
 +
* [http://www.mysql.gr.jp/doc.html 上記以外の MySQL バージョンの日本語マニュアル](日本MySQLユーザ会)
 +
* [http://www.mysql.gr.jp/ 日本MySQLユーザ会 (MyNA)] &raquo; [http://www.mysql.gr.jp/frame/modules/bwiki/index.php?FAQ#content_1_40 FAQ &raquo; 4.1以上の壁 (日本語の扱いの違い、文字化け等/含む5.0以上) ]
 
*[http://gentoo-wiki.com/TIP_Convert_latin1_to_UTF-8_in_MySQL Gentoo tip on converting latin1 to utf8 in MySQL] (en)
 
*[http://gentoo-wiki.com/TIP_Convert_latin1_to_UTF-8_in_MySQL Gentoo tip on converting latin1 to utf8 in MySQL] (en)
 
*[http://alexking.org/blog/2008/03/06/mysql-latin1-utf8-conversion Alex King's blog about latin1 to utf8 conversion] (en)
 
*[http://alexking.org/blog/2008/03/06/mysql-latin1-utf8-conversion Alex King's blog about latin1 to utf8 conversion] (en)
 +
<!-- *[http://bono.s201.xrea.com/2006/03/11-utf8_xrea_3/#h3 power source* » XREAにUTF8設置時の文字化け: 3)解決編] -- 使用中の MySQL キャラクタセットの確認方法の例(サーバ・クライアントのキャラクターセット、文字コード自動変換オプション) -->
 +
 +
{{原文|Converting Database Character Sets|54336}}
 +
 +
{{DEFAULTSORT:てえたへえすもしこおとせつとのへんかん}}
 +
[[Category:上級トピック]]
 +
[[Category:wp2.2]]
 +
 +
[[en:Converting Database Character Sets]]

2008年4月7日 (月) 22:17時点における版

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

訳注: 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最新版との差分