SET型

広告

ここでは文字列型の中でもSET型について確認していきます。書式は次の通りです。

SET('value1','value2',...)

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

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

例として次のように記述します。

mysql> CREATE TABLE test(col SET('red','blue','yellow'));

p8-1

カラムcolにはSET型が設定してあります。SET型には'red','blue','yellow'の3つの値をリストとして記載していますので、このテーブルにデータを追加する場合にはcolカラムには'red','blue','yellow'の0個以上の組み合わせたものを指定します。

INSERT INTO test(col) VALUES('red');
INSERT INTO test(col) VALUES('blue');
INSERT INTO test(col) VALUES('red,yellow');
INSERT INTO test(col) VALUES('red,blue,yellow');
INSERT INTO test(col) VALUES('');

p8-2

データを格納し、格納されたデータを取得してみます。

p8-3

リストに含まれていない値を格納しようとした場合、Strict modeが有効な場合にはエラーとなります。無効の場合には空白が代入されます。

mysql> INSERT INTO test(col) VALUES('black');

p8-4

実際試してみるとエラーとなりますのでMySQLサーバがStrict modeが有効となっています。Strict modeについてはENUM型のページで記載していますので、詳しくは「ENUM型」を参照して下さい。

複数の値を指定したデータは、記述されて順番に関係なく、SET型のリストの中に記述された順序を使ってデータが格納されます。

mysql> INSERT INTO test(col) VALUES('red,blue');

mysql> INSERT INTO test(col) VALUES('blue,red');

p8-5

NULL

NULLはリストに含まれていない場合でもデータとして指定することができます。

mysql> INSERT INTO test(col) VALUES(null);

p8-6

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

ビットを使った指定

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

SET('red','blue','yellow')

'red'      0001 (=1)
'blue'     0010 (=2)
'yellow'   0100 (=4)

SET型が設定されているカラムにデータを追加する場合、文字列の代わりにビットを使って指定することができます。

mysql> INSERT INTO test(col) VALUES(4);

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

複数の値を指定する場合は、各値のビットをORした結果を使って指定することができます。

mysql> INSERT INTO test(col) VALUES(5);

上記の場合、5(=0101)ですので該当する'red,yellow'が格納されます。

p8-7

文字セットと照合順序

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

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

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

( Written by Tatsuo Ikura )