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

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

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

提供: WordPress Codex 日本語版
移動先: 案内検索
(en:Converting_Database_Character_Sets 2008年3月6日 14:39 MichaelH 版)
 
({{Old}})
 
(2人の利用者による、間の5版が非表示)
1行目: 1行目:
This article addresses, in general, the process of converting your WordPress [[Glossary#MySQL|MySQL]] [[Database Description|database tables]] from one [[Glossary#Character set|character set]] to another.  '''Warning:  character set conversion is not a simple process.  Please complete a backup of your database before attempting any conversion.'''
+
{{Old}}
  
==The History==
+
この記事では、一般的に WordPress [[用語集#MySQL|MySQL]] [[データベース概要|データベーステーブル]]を、ある[[用語集#Character set|文字コード]](キャラクタセット)から別の文字コードに変換する方法について説明します。
Up to and including WordPress [[Version 2.1.3]], most WordPress databases were created using the ''latin1'' character set and the ''latin1_swedish_ci'' [[Glossary#Collation|collation]].
+
  
==Character set and collation can now be defined==
+
'''注: 文字コードを変換する作業は簡単とはいえません。変換を試す前にデータベースのバックアップを完了させておきましょう。'''
Beginning with [[Version 2.2]], WordPress allows the user to define both the database character set and the collation in their [[Editing wp-config.php|wp-config.php]] file.  Setting the [[Editing wp-config.php#Database character set|DB_CHARSET]] and [[Editing wp-config.php#Database collation|DB_COLLATE]] values in ''wp-config.php'' causes WordPress to create the database with the appropriate settings.  But, the setting can only be designated for new installations, not for 'already installed' copies of WordPress.  The rest of this article will explain how to convert the character set and collation for existing WordPress installations.
+
  
==Converting your database==
+
<div id="The_History">
Before beginning any conversion, please backup your database. [[Backing Up Your Database]] has easy to following instructions.
+
==これまでの背景==
+
</div>
For discussion purposes, it is assumed you have a database in the '''latin1''' character set that needs converting to a '''utf8''' character set.
+
WordPress [[:en:Version 2.1.3|バージョン 2.1.3]] およびそれ以前のバージョンでは、ほとんどの WordPress データベースは ''latin1'' の文字コードと ''latin1_swedish_ci'' の[[用語集#照合順序|照合順序]]で作成されていました。
  
===The Problem==
+
<div id="Character_set_and_collation_can_now_be_defined">
To convert character sets requires using the the MySQL ALTER TABLE command. When converting the character sets, all TEXT (and similar) fields are converted to UTF-8, but that conversion will BREAK existing TEXT because the conversion expects the data to be in latin1, but WordPress may have stored unicode characters in a latin1 database, and as a result, data could end up as garbage after a conversion!
+
==文字コード・照合順序の定義==  
 +
</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 の文字コードと照合順序を変換する方法については、以下で説明しています。
  
===The Solution===
+
訳注: 2.1.3 以前に WordPress コアファイルに <code>SET NAMES 'utf8'</code> を挿入して運用していた場合は、その修正の替わりに <code>DB_CHARSET</code> 定義を使えます(同じ処理が行なわれます)。
The solution is to ALTER all TEXT and related fields to their binary counterparts, then alter the character set and finally change the binary data type fields back to TEXT.
+
  
Example steps:
+
<div id="Converting_your_database">
# Place notice that blog is out of service
+
==データベースの変換==
# Backup database
+
</div>
# ALTER TABLE wp_users MODIFY display_name BLOB;
+
変換を始める前に、データベースのバックアップを必ず行ってください。[[Backing up your database|データベースのバックアップ]] に、分かりやすい手順があります。
# ...ALTER TABLE commands for all other tables/columns...
+
# ALTER DATABASE wordpress charset=utf8;
+
# ALTER TABLE wp_users charset=utf8;
+
# ...ALTER TABLE command for all other tables...
+
# ALTER TABLE wp_users MODIFY display_name TEXT CHARACTER SET utf8;
+
# ...ALTER TABLE for all other tables/columns...
+
# Add DB_CHARSET and DB_COLLATE definitions to [[Editing_wp-config.php|wp-config.php]]
+
# Place blog back on-line
+
  
The string field types need to be converted to their binary field types counterparts. The list is as follows:
+
説明を単純にするため、ここでは文字コードが '''latin1''' のデータベースを '''utf8''' に変換するものとします。
 +
 
 +
<div id="The_Problem">
 +
===問題点===
 +
</div>
 +
文字コードを変換するには、MySQL の <code>ALTER TABLE</code> コマンドを使用する必要があります。文字コードを変換すると、すべての TEXT 型フィールド(および類似フィールド)が UTF-8 に変換されますが、その際に格納されているテキストデータが壊れてしまいます。これは、MySQL 側では変換前のデータが latin1 文字コードで保存されていることを前提にしているのですが、WordPress は(UTF-8 で動いているため) unicode の文字をデータベースに保存していることがあり、変換後に文字化けしてしまうのです。
 +
 
 +
<div id="The_Solution">
 +
===解決策===
 +
</div>
 +
この問題を回避するため、まずすべての TEXT 型および類似フィールドを、対応するバイナリのデータ型に <code>ALTER</code> コマンドを使って変換します。文字コードを変換した後、データ型を元に戻します。
 +
 
 +
作業例:
 +
# ブログにメンテナンス中のお知らせを掲載
 +
# データベースをバックアップ
 +
# <code>ALTER TABLE wp_users MODIFY display_name BLOB;</code> を実行
 +
# その他の全テーブルおよびカラムに <code>ALTER TABLE</code> コマンドを実行
 +
# <code>ALTER DATABASE wordpress charset=utf8;</code> を実行
 +
# <code>ALTER TABLE wp_users charset=utf8;</code> を実行
 +
# その他の全テーブルに <code>ALTER TABLE</code> コマンドを実行
 +
# <code>ALTER TABLE wp_users MODIFY display_name TEXT CHARACTER SET utf8;</code> を実行
 +
# その他の全テーブルおよびカラムに <code>ALTER TABLE</code> コマンドを実行
 +
# [[wp-config.php_の編集|wp-config.php]] ファイルに <code>DB_CHARSET</code> と <code>DB_COLLATE</code> の定義を追加
 +
# メンテナンス中のお知らせを解除
 +
 
 +
文字列型フィールドは、対応するバイナリ型に変換しなくてはなりません。以下が対応表です。
 
* CHAR -> BINARY
 
* CHAR -> BINARY
 
* VARCHAR -> VARBINARY
 
* VARCHAR -> VARBINARY
39行目: 55行目:
 
* LONGTEXT -> LONGBLOB
 
* LONGTEXT -> LONGBLOB
  
This information was originally posted by member g30rg3x in [http://wordpress.org/support/topic/117955 Forum Thread 117955].
+
この情報の原文は、[http://wordpress.org/support/topic/117955 英語フォーラムのスレッド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;
 +
 
 +
<!-- The field name does need to be repeated, as well as the ENUM specification. -->
 +
項目名は ENUM 設定と同様に繰り返す必要があります。
 +
 
 +
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 で最初に変換した項目タイプを元のタイプに戻すのです。
  
ENUM and SET have more specific conversion rules:
+
変換の鍵となるのは、バイナリデータ型のフィールドは、データベースやテーブルを utf8 に切り替えても、CHAR、VARCHAR、TEXT、ENUM、SET 型のフィールドのようには文字化けしないという事です。
Set the character set to binary, or to UTF8 if you are sure that no ENUM or SET field has special characters that might get garbled during conversion.
+
The SQL for this is:
+
* 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.
+
  
When specifying BINARY and VARBINARY, the field length also needs to be specified, and needs to be the same value as the original CHAR and VARCHAR field length. In other words, VARCHAR(200) becomes VARBINARY(200).
+
<div id="Conversion_Scripts_and_Plugins">
+
====変換プラグイン====
So, in Steps 3 and 4 change CHAR, VARCHAR, TEXT, ENUM, and SET fields to their binary counterparts (BLOB, VARBINARY, etc), in Step 5 switch the database to utf8, in Steps 6 and 7 switch all the tables to utf8, and finally, in Steps 8 and 9 return the binary fields back to the respective CHAR, VARCHAR, TEXT, ENUM, and SET data types with the utf8 character set.
+
</div>
 +
g30rg3_x の作成した [http://g30rg3x.com/utf8-database-converter/ UTF-8 Database Converter] というプラグインがあります。利用する場合は、同梱の Readme ファイルをしっかり読みましょう。
  
The key to the conversion is that a field with a binary data type, unlike CHAR, VARCHAR, TEXT, ENUM, and SET fields, will not be converted to garbage when the database and tables are switched to utf8.
+
<div id="Discussions on character sets">
 +
==文字コードに関する話題==
 +
</div>
 +
以下に加え、このページの原文である [[:en:Converting Database Character Sets|Codex のページ]]にも英語フォーラムへのリンクなどがあります。
  
====Conversion Scripts and Plugins====
+
*http://trac.wordpress.org/ticket/2828 (en)
In the WordPress Forums, Member andersapt, in [http://wordpress.org/support/topic/117955 Forum Thread 117955] submitted a conversion script, [http://kunde.apt.no/aso/wordpress/convert_to_utf8_sql_generator.txt Convert UTF8 SQL Generator], to automatically convert a WordPress database. (This link is currently dead.)
+
*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)
 +
*[http://jonkenpon.com/2007/02/20/making-your-wordpress-database-portable-because-it-probably-isnt-right-now/ Making your Wordpress database portable (because it probably isn’t right now…)] (en)
 +
*[http://ja.forums.wordpress.org/tags.php?tag=文字コード WordPress 日本語フォーラム「文字コード」タグ]
  
A plugin, [http://g30rg3x.com/utf8-database-converter/ UTF-8 Database Converter], is available from g30rg3_x. Carefully review the readme file included with the plugin.
+
<div id="Resources">
 +
== 参考資料 ==
 +
</div>
 +
*[http://ja.wikipedia.org/wiki/文字コード Wikipedia: 文字コード]
 +
*[http://ja.wikipedia.org/wiki/Unicode Wikipedia: Unicode]
 +
*[http://ja.wikipedia.org/wiki/UTF-8 Wikipedia: UTF-8]
 +
* MySQL 5.1 リファレンスマニュアル
 +
** [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://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 キャラクタセットの確認方法の例(サーバ・クライアントのキャラクターセット、文字コード自動変換オプション) -->
  
==Discussions on character sets==
+
{{原文|Converting Database Character Sets|54336}}
*http://trac.wordpress.org/ticket/2828
+
*http://trac.wordpress.org/ticket/2942
+
*http://trac.wordpress.org/ticket/3184
+
*http://trac.wordpress.org/ticket/3517
+
*http://trac.wordpress.org/ticket/4219
+
*http://comox.textdrive.com/pipermail/wp-testers/2007-May/004510.html
+
*http://jonkenpon.com/2007/02/20/making-your-wordpress-database-portable-because-it-probably-isnt-right-now/
+
*http://wordpress.org/support/topic/101135
+
*http://wordpress.org/support/topic/116746
+
*http://wordpress.org/support/topic/117865
+
*http://wordpress.org/support/topic/117955
+
*http://wordpress.org/support/topic/117999
+
*http://wordpress.org/support/topic/118781
+
*http://wordpress.org/support/topic/119611
+
*http://wordpress.org/support/topic/119750
+
*http://wordpress.org/support/topic/119858
+
*http://wordpress.org/support/topic/119998
+
*http://wordpress.org/support/topic/119999
+
*http://wordpress.org/support/topic/120029
+
*http://wordpress.org/support/topic/120065
+
*http://wordpress.org/support/topic/120135
+
*http://wordpress.org/support/topic/120352
+
*http://wordpress.org/support/topic/120397
+
*http://wordpress.org/support/topic/120414
+
*http://wordpress.org/support/topic/120466
+
*http://wordpress.org/support/topic/120562
+
*http://wordpress.org/support/topic/120687
+
*http://wordpress.org/support/topic/144884
+
  
==Resources==
+
{{DEFAULTSORT:てえたへえすもしこおとせつとのへんかん}}
*[http://en.wikipedia.org/wiki/Character_set Character set at Wikipedia]
+
[[Category:上級トピック]]
*[http://en.wikipedia.org/wiki/Unicode Unicode at Wikipedia]
+
[[Category:wp2.2]]
*[http://en.wikipedia.org/wiki/UTF-8 UTF-8 at Wikipedia]
+
*[http://dev.mysql.com/doc/refman/5.0/en/charset-general.html Character sets and collation at MySQL]
+
*[http://dev.mysql.com/doc/refman/5.0/en/charset-charsets.html Character Sets and Collations That MySQL Supports]
+
*[http://gentoo-wiki.com/TIP_Convert_latin1_to_UTF-8_in_MySQL Gentoo tip on converting latin1 to utf8 in MySQL]
+
*[http://alexking.org/blog/2008/03/06/mysql-latin1-utf8-conversion Alex King's blog about latin1 to utf8 conversion]
+
  
[[Category:Advanced_Topics]]
+
[[en:Converting Database Character Sets]]
[[Category:New page created]]
+
{{Stub}}
+

2015年8月13日 (木) 10:45時点における最新版

このページ「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最新版との差分