SET
はゼロ、またはそれ以上の値を持つことができる文字列オブジェクトであり、それらはそれぞれ、テーブルが作成された時に指定された許容値リストから選択する必要があります。複数セットメンバーによって成り立つ
SET
カラム値は、カンマで区切られたメンバーによって指定されます。(‘,
’)この結果は、SET
メンバー値自体はコンマを含むべきではないという事です。
例えば、SET('one', 'two') NOT
NULL
として指定されたカラムはここに表されている値のどれでも持つ事ができます。
'' 'one' 'two' 'one,two'
SET
は最高64の異なるメンバを持つ事ができます。
テーブルが作成された時に、テーブル定義の中の
SET
メンバー値から後続スペースが自動的に削除されます。
検索された時は、SET
カラムに格納された値はカラム定義で使用されたレターケースで表示されます。SET
カラムは文字セットと照合に指定できる事を覚えて置いてください。バイナリ、またはケースに敏感な照合には、カラムに値を指定する時レターケースが考慮されます。
MySQLは、最初のセットメンバに対応する格納値の低位ビットを利用して
SET
値を数値で格納します。SET
値を数値コンテキストで検索すると、その値は、カラム値を構成するセットメンバーに対応するビットセットを持ちます。例えば、このようにして
SET
カラムから数値を検索する事ができます。
mysql> SELECT set_col
+0 FROM tbl_name
;
もしメンバがSET
カラムに格納されると、その数字のバイナリ表現に設定されているビットがカラム値のセットメンバを決定します。SET('a','b','c','d')
として指定されたカラムには、メンバは次の少数とバイナリ値を持ちます。
SET メンバ
|
少数値 | バイナリ値 |
'a' |
1 |
0001 |
'b' |
2 |
0010 |
'c' |
4 |
0100 |
'd' |
8 |
1000 |
もしこのカラムに、バイナリでは
1001
となる 9
を指定すると、最初と4番目の SET
値メンバである 'a'
と
'd'
が選択され、結果値は
'a,d'
となります。
1つ以上の SET
エレメントを含む値には、値を挿入する時のエレメントがどの順番でリストされるかは関係ありません。また、決められたエレメントがその値の中で何回リストされるかという事も関係ありません。値が後で検索される時には、テーブル作成時に指定された順番に従ってリストされたエレメントと一緒に、値の中のそれぞれのエレメントが一度表示されます。例えば、カラムが
SET('a','b','c','d')
として指定されたと仮定します。
mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
もし
'a,d'
、'd,a'
、'a,d,d'
、'a,d,a'
、そして
'd,a,d'
という値を挿入すると、次のようになります。
mysql> INSERT INTO myset (col) VALUES
-> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
すると、これらの値が検索された時、'a,d'
と表示されます。
mysql> SELECT col FROM myset;
+------+
| col |
+------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+------+
5 rows in set (0.04 sec)
もしサポートされていない値に
SET
カラムを設定すると、その値は無視され警告が表示されます。
mysql>INSERT INTO myset (col) VALUES ('a,d,d,s');
Query OK, 1 row affected, 1 warning (0.03 sec) mysql>SHOW WARNINGS;
+---------+------+------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------+ | Warning | 1265 | Data truncated for column 'col' at row 1 | +---------+------+------------------------------------------+ 1 row in set (0.04 sec) mysql>SELECT col FROM myset;
+------+ | col | +------+ | a,d | | a,d | | a,d | | a,d | | a,d | | a,d | +------+ 6 rows in set (0.01 sec)
もしストリクトSQLモードが有効なら、無効な
SET
値を挿入しようとするとエラーが発生します。
SET
値は数値でソートされます。NULL
値は非 NULL
SET
値の前にソートします。
通常は、FIND_IN_SET()
関数か
LIKE
オペレーターを利用して
SET
値を検索します。
mysql>SELECT * FROM
mysql>tbl_name
WHERE FIND_IN_SET('value
',set_col
)>0;SELECT * FROM
tbl_name
WHEREset_col
LIKE '%value
%';
最初のステートメントは
set_col
が
value
セットメンバを含む行を見つけます。二つ目のステートメントも似ていますが、全く同じではありません。2つ目のステートメントは、他のセットメンバの部分列としても、set_col
が value
をどこかに含む行を見つけます。
次のステートメントもまた正当です。
mysql>SELECT * FROM
mysql>tbl_name
WHEREset_col
& 1;SELECT * FROM
tbl_name
WHEREset_col
= 'val1
,val2
';
これらのステートメントの最初の部分が最初のセットメンバを含む値を探します。二つ目の部分が正確に適合する値を探します。二つ目のタイプの比較に注意してください。'
のセット値を比較すると、val1
、val2
''
を比較するよりも異なる結果が返されます。カラム定義の中でリストされているのと同じ順番で値を指定する必要があります。
val2
、val1
'
SET
カラムに有効な全ての値を究明したければ、SHOW
COLUMNS FROM
を利用し、アウトプットの tbl_name
LIKE
set_col
Type
カラムの中の SET
定義を解析してください。