Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


10.1.13 カラム文字セットの変換

特定の文字セットを使用するようにバイナリ文字列または非バイナリ文字列カラムを変換するには、ALTER TABLE を使用します。正しく変換が行われるには、次の条件のいずれかを適用する必要があります。

  • カラムにバイナリデータ型 (BINARYVARBINARYBLOB) がある場合、含まれるすべての値は、単一の文字セット (カラムの変換後の文字セット) を使用してエンコードされる必要があります。バイナリカラムを使用して複数の文字セットで情報を格納する場合、MySQL はどの値がどの文字セットを使用するかを認識できず、データを正確に変換できません。

  • カラムに非バイナリデータ型 (CHARVARCHARTEXT) がある場合、その内容は、カラムの文字セットでエンコードする必要があり、ほかの文字セットは使用できません。内容が別の文字セットでエンコードされている場合、最初にバイナリデータ型を使用するようにカラムを変換してから、使用する文字セットで非バイナリカラムに変換できます。

VARBINARY(50) として定義された col1 という名前のテーブル t にバイナリカラムがあるとします。カラム内の情報が、単一の文字セットを使用してエンコードされているとすると、このカラムを、その文字セットを含む非バイナリカラムに変換できます。たとえば、col1greek 文字セットの文字を表すバイナリデータが含まれる場合、次のように変換できます。

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);

テーブル tCHAR(50) CHARACTER SET latin1 として定義された col1 という名前の非バイナリ列があるが、utf8 を使用するようにこれを変換し、多くの言語の値を格納できるようにするとします。次のステートメントでこれを実行できます。

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET utf8;

両方の文字セットにない文字がカラムに含まれている場合、変換の損失が大きくなることがあります。

MySQL 4.1 より前の古いテーブルがある場合、実際にはサーバーのデフォルトの文字セットと異なる文字セットでエンコードされた値が、非バイナリカラムに含まれるという特殊な状況が起こります。たとえば、MySQL のデフォルト文字セットが latin1 であっても、アプリケーションは sjis 値をカラムに格納します。適切な文字セットを使用するために、カラムを変換することは可能ですが、追加ステップが必要になります。たとえば、サーバーのデフォルト文字セットが latin1 で、col1CHAR(50) と定義されているにもかかわらず、内容は sjis 値であるとします。最初のステップでは、バイナリデータ型にカラムを変換することで、文字変換を実行しないで既存の文字セット情報を取り除きます。

ALTER TABLE t MODIFY col1 BLOB;

次のステップでは、適切な文字セットを使用して、非バイナリデータ型にカラムを変換します。

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET sjis;

この手順では、MySQL 4.1 以降にアップグレードしたあと、テーブルが INSERTUPDATE などのステートメントで変更されていない必要があります。その場合、MySQL は latin1 を使用してカラムに新しい値を格納し、そのカラムは sjis 値と latin1 値を同時に含んでおり、正確に変換できません。

最初にカラムを作成するときに属性を指定した場合、ALTER TABLE を使用してテーブルを変更しているときにも属性を指定する必要があります。たとえば、NOT NULL と明示的な DEFAULT 値を指定した場合、ALTER TABLE ステートメントでも指定する必要があります。指定しない場合、結果のカラム定義にはこれらの属性が含まれません。

テーブル内のすべての文字カラムを変換するには、ALTER TABLE ... CONVERT TO CHARACTER SET charset ステートメントが役立つことがあります。セクション13.1.7「ALTER TABLE 構文」を参照してください。