特定のキャラクタセット使用のため、バイナリもしくはバイナリではない文字列カラムの変換には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ステートメントでも特定する必要があります。でなければ、結果のカラム定義にはそれらの属性が含まれません。
