SET型

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

(Last modified: )

SET型について

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

文字列型の中でも SET 型は、事前に定義した文字列のリストの中から、 0 個以上の値を組み合わせた値を格納することができるデータ型です。内部的には SET 値は整数として格納され、各値にはビットが割り当てられます。

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

文字列リストには最大 64 個の個別の要素を含めることができます。

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 型のリストの中に記述された順序でデータが格納されます。例えば次のようなデータを追加した場合、 2 番目のカラムの値として 'White,Blue' を追加していますが、実際に格納されたデータを取得してみると 'Blue,White' として格納されています。

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

select * from strtest;

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' が格納されます。

select * from strtest;

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

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

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

select * from strtest;

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

文字セットと照合順序

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

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

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

-- --

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

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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