特定の文字セットを使用するようにバイナリ文字列または非バイナリ文字列カラムを変換するには、ALTER TABLE
を使用します。 正しく変換が行われるには、次の条件のいずれかを適用する必要があります。
カラムにバイナリデータ型 (
BINARY
、VARBINARY
、BLOB
) がある場合、含まれるすべての値は、単一の文字セット (カラムの変換後の文字セット) を使用してエンコードされる必要があります。 バイナリカラムを使用して複数の文字セットで情報を格納する場合、MySQL はどの値がどの文字セットを使用するかを認識できず、データを正確に変換できません。カラムに非バイナリデータ型 (
CHAR
、VARCHAR
、TEXT
) がある場合、その内容は、カラムの文字セットでエンコードする必要があり、ほかの文字セットは使用できません。 内容が別の文字セットでエンコードされている場合、最初にバイナリデータ型を使用するようにカラムを変換してから、使用する文字セットで非バイナリカラムに変換できます。
VARBINARY(50)
として定義された col1
という名前のテーブル t
にバイナリカラムがあるとします。 カラム内の情報が、単一の文字セットを使用してエンコードされているとすると、このカラムを、その文字セットを含む非バイナリカラムに変換できます。 たとえば、col1
に greek
文字セットの文字を表すバイナリデータが含まれる場合、次のように変換できます。
ALTER TABLE t MODIFY col1 VARCHAR(50) CHARACTER SET greek;
元のカラムに BINARY(50)
のタイプがある場合は、それを CHAR(50)
に変換できますが、結果の値の末尾に 0x00
バイトが埋め込まれるため、望ましくない場合があります。 これらのバイトを削除するには、TRIM()
関数を使用します。
UPDATE t SET col1 = TRIM(TRAILING 0x00 FROM col1);
テーブル t
に CHAR(50) CHARACTER SET latin1
として定義された col1
という名前の非バイナリ列があるが、utf8
を使用するようにこれを変換し、多くの言語の値を格納できるようにするとします。 次のステートメントでこれを実行できます。
ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET utf8;
両方の文字セットにない文字がカラムに含まれている場合、変換の損失が大きくなることがあります。
MySQL 4.1 より前の古いテーブルがある場合、実際にはサーバーのデフォルトの文字セットと異なる文字セットでエンコードされた値が、非バイナリカラムに含まれるという特殊な状況が起こります。 たとえば、アプリケーションでは、MySQL のデフォルトの文字セットが異なる場合でも、カラムに sjis
値が格納されていることがあります。 適切な文字セットを使用するために、カラムを変換することは可能ですが、追加ステップが必要になります。 たとえば、サーバーのデフォルト文字セットが latin1
で、col1
は CHAR(50)
と定義されているにもかかわらず、内容は sjis
値であるとします。 最初のステップでは、バイナリデータ型にカラムを変換することで、文字変換を実行しないで既存の文字セット情報を取り除きます。
ALTER TABLE t MODIFY col1 BLOB;
次のステップでは、適切な文字セットを使用して、非バイナリデータ型にカラムを変換します。
ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET sjis;
この手順では、MySQL 4.1 以上へのアップグレード後に、INSERT
や UPDATE
などのステートメントを使用してテーブルがまだ変更されていないことが必要です。 その場合、MySQL は latin1
を使用してカラムに新しい値を格納し、カラムには sjis
と latin1
の値が混在しているため、適切に変換できません。
最初にカラムを作成するときに属性を指定した場合、ALTER TABLE
を使用してテーブルを変更しているときにも属性を指定する必要があります。 たとえば、NOT NULL
と明示的な DEFAULT
値を指定した場合、ALTER TABLE
ステートメントでも指定する必要があります。 それ以外の場合、結果のカラム定義にはこれらの属性は含まれません。
テーブル内のすべての文字カラムを変換するには、ALTER TABLE ... CONVERT TO CHARACTER SET
ステートメントが役立つことがあります。 セクション13.1.9「ALTER TABLE ステートメント」を参照してください。
charset