特定のキャラクタセット使用のため、バイナリもしくはバイナリではない文字列カラムの変換にはALTER
TABLE
を使用してください。正確な変換のためには、以下の条件の内一つが適用されなければなりません。
カラムがバイナリデータ型(BINARY
、VARBINARY
、BLOB
)である場合、含まれる全ての値は1つのキャラクタセット(カラムを変換しようとしているキャラクタセット)を使ってエンコードされている必要があります。バイナリカラムを使って複数のキャラクタセット情報を保存する場合、MySQLはどの値がどのキャラクタセットを使用するのか特定できず、データを正確に変換できません。
カラムにバイナリではないデータ型(CHAR
、VARCHAR
、TEXT
)が存在する場合、内容は他のキャラクタセットではなく、カラムのキャラクタセットでエンコードされている必要があります。内容が他のキャラクタセットでエンコードされている場合、先にバイナリデータ型を使用するようカラムを変換して、望ましいキャラクタセットのバイナリでないカラムに変換することができます。
例えばテーブルt
がBINARY(50)
として定義されているcol1
というバイナリカラムだとします。カラムに含まれる情報が1つのキャラクタセットを使用してエンコードされていると想定して、キャラクタセットを持つバイナリでないカラムに変換することができます。例えば、col1
にはgreek
の文字を表すキャラクタセットのバイナリデータが含まれる場合、以下のように変換できます。
ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET greek;
例えばそのテーブルt
はcol1
というCHAR(50)
CHARACTER SET
latin1
と定義された、バイナリでないカラムを含むとします。utf8
を使用し多言語からの値を保存するために変換したいとします。以下のステートメントはこれを実行します。
ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET utf8;
カラムに、両キャラクタセットに含まれない文字がある場合、変換は正確に実行されません。
4.0もしくはそれ以前のバージョンから古いテーブルを使用する場合、特定のケースが生じます。ここでは、バイナリでないカラムは、サーバのデフォルトキャラクタセットと異なるキャラクタセットでエンコードされた値を含みます。例えば、MySQLのデフォルトキャラクタセットがlatin1
であっても、アプリケーションはsjis
値をカラムに保存します。適切なキャラクタセットを使用するために、カラムを変換することは可能ですが、追加ステップが必要となります。例えばサーバのデフォルトキャラクタセットがlatin1
でcol1
はCHAR(50)
と定義されているにもかかわらず、内容はsjis
値とします。最初のステップは、バイナリデータ型にカラムを変換することで、既存のキャラクタセット情報を文字変換なしで取り除くことです。
ALTER TABLE t MODIFY col1 BINARY(50);
次のステップは適切なキャラクタセットを用いたバイナリでないデータ型にカラムを変換することです。:
ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET sjis;
このプロシージャは、MySQL4.1もしくはそれ以降にアップグレード後、テーブルがINSERT
やUPDATE
のようなステートメントで修正されていないことが求められます。
その場合、MySQL
はlatin1
を使い新しい値を保存し、カラムはsjis
とlatin1
値を同時に含んでおり、正確に変換することはできません。
最初にカラムを作成するときに属性を特定した場合、ALTER
TABLE
を使ってテーブルを変更しているときも属性を特定する必要があります。例えばNOT
NULL
と明示的なDEFAULT
値を特定した場合、ALTER
TABLE
ステートメントでも特定する必要があります。でなければ、結果のカラム定義にはそれらの属性が含まれません。