SET型

MySQL で利用可能なデータ型の中で文字列型の SET 型の使い方について解説します。

(Last modified: )

SET型について

文字列型の中でも SET 型は次のようなデータ型です。

SET('value1','value2',...) [CHARACTER SET charset_name]
 [COLLATE collation_name]

ゼロ個以上の値を持つことができます。
それぞれの値は、'value1'、'value2'、... 値のリストから選択します。
SET 値は整数として内部で表されます。
SET カラムには最大 64 個の個別のメンバーを含めることができます。

SET 型では文字列定数をリストします。このデータ型が設定されたカラムに値を格納する場合、このリストの中の 0 個以上の定数を指定します。( 2 個以上指定する場合はカンマで区切ります)。

SET 型と ENUM 型は似ていますが、 ENUM 型は格納可能な値の一覧を定義し一つ選択しているのに対して、 SET 型は指定可能な値の組み合わせを定義し、データとして格納するのは組み合わせを指定します。

例として SET 型のカラムを持つテーブルを作成してみます。

create table strtest(product varchar(8), num1 SET('Blue', 'Yellow', 'White'));

SET型について(1)

SET 型のカラムには値として 'Blue' 、 'Yello' 、 'White' がリストされています。よってこのカラムにはこの3つの文字列の 0 個以上の組み合わせたものを指定します。複数指定する場合はカンマで区切ります。

'Blue'
'Yellow'
'White'
'Yellow,White'
'White,Yellow,White'
''

例えば次のようなデータを追加することができます。

insert into strtest values('Desk', 'Blue');
insert into strtest values('Mouse', 'Yellow,White');

SET型について(2)

リストに含まれていない値を格納しようとすると Data truncated for column 'カラム名' というエラーが発生します。

insert into strtest values('PC', 'Green');

SET型について(3)

複数の値を組み合わせた場合、記述された順番に関係なく SET 型のリストの中に記述された順序でデータが格納されます。

insert into strtest values('Chair', 'Blue,White'); insert into strtest values('Printer', 'White,Blue');

SET型について(4)

NULLの扱い

NULL は SET 型のリストに含まれていない場合でもデータとして格納することができます。先ほど作成したテーブルに次のようなデータを追加してみます。

insert into strtest values('Mobile', NULL);

NULLの扱い(1)

それではテーブルからデータを取得してみます。

select * from strtest;

NULLの扱い(2)

NULL はそのまま NULL として格納されます。

ビットを使った指定

SET 型にリストされた文字列定数には順に次のようにビットが割り当てられます。

SET('Red','Yellow','White')

'Blue'     0001 (=1)
'Yellow'   0010 (=2)
'White'    0100 (=4)

SET 型が設定されているカラムにデータを追加する場合、文字列の代わりにビットを使って指定することができます。例として先ほど作成したテーブルに次のようなデータを追加してみます。

insert into strtest values('Cup', 2);

上記の場合、ビット 2 に該当する 'Yellow' が格納されます。

ビットを使った指定(1)

複数の値を指定する場合は、各値のビットを OR した結果を使って指定することができます。例えば 'Blue,White' の値を格納するのであれば 0001 と 0100 の OR した結果である 0101 (=5) を指定します。

insert into strtest values('Trash', 5);

ビットを使った指定(2)

文字セットと照合順序

SET 型は文字セットと照合順序を指定することができます。使い方は次の通りです。

SET('value1','value2',...) [CHARACTER SET 文字セット]
[COLLATE 照合順序]

文字セットと照合順序の設定については CHAR 型などと同じです。詳しくは「CHAR型とVARCHAR型」を参照して下さい。

-- --

MySQL で利用可能なデータ型の中で文字列型の SET 型の使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。