SET
はゼロ、またはそれ以上の値を持つことができる文字列オブジェクトであり、それらはそれぞれ、テーブルが作成されたときに指定された許容値リストから選択する必要があります。SET
型のカラム値が複数のメンバーで構成される場合は、各メンバーをコンマ
(「,
」)
で区切って指定します。このことから、SET
メンバーの値自体にはコンマを含めないようにしてください。
たとえば、SET('one', 'two') NOT
NULL
として指定したカラムは、次に示す値のいずれかを取ります。
'' 'one' 'two' 'one,two'
SET
は最高 64
の異なるメンバーを持つことができます。
定義の中に重複した値が含まれていると、警告 (厳密な SQL モードが有効になっている場合はエラー) が発生します。
テーブルが作成されたときに、テーブル定義の中の
SET
メンバー値から末尾のスペースが自動的に削除されます。
検索されたときは、SET
カラムに格納された値はカラム定義で使用されたレターケースで表示されます。SET
カラムはキャラクタセットと照合に指定できることを覚えて置いてください。バイナリ、またはケースに敏感な照合には、カラムに値を指定するときレターケースが考慮されます。
MySQL
は、最初のセットメンバーに対応する格納値の低位ビットを利用して
SET
値を数値で格納します。SET
値を数値コンテキストで検索すると、その値は、カラム値を構成するセットメンバーに対応するビットセットを持ちます。たとえば、このようにして
SET
カラムから数値を検索することができます。
mysql> SELECT set_col
+0 FROM tbl_name
;
もしメンバーが
SET
カラムに格納されると、その数字のバイナリ表現に設定されているビットがカラム値のセットメンバーを決定します。カラムが
SET('a','b','c','d')
として指定されている場合、セットメンバーは次の
10 進値と 2 進値を持ちます。
SET
メンバー
|
10 進値 | バイナリ値 |
a |
1 |
0001 |
b |
2 |
0010 |
'c' |
4 |
0100 |
d |
8 |
1000 |
このカラムに値 9
を割り当てた場合、2 進数では
1001
となるため、SET
値の最初と 4 番目のメンバーである
'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
値の前にソートします。
数値引数を要求する
SUM()
や
AVG()
などの関数は、必要に応じて数値引数を数値にキャストします。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
つめのステートメントも似ていますが、まったく同じではありません。2
つめのステートメントは、ほかのセットメンバーの部分列としても、set_col
が value
をどこかに含む行を見つけます。
次のステートメントもまた正当です。
mysql>SELECT * FROM
mysql>tbl_name
WHEREset_col
& 1;SELECT * FROM
tbl_name
WHEREset_col
= 'val1
,val2
';
これらのステートメントの最初の部分が最初のセットメンバーを含む値を探します。2
つめの部分が正確に適合する値を探します。2
つめの型の比較に注意してください。セット値を
'
と比較すると、値を
val1
,val2
''
と比較するのとは異なる結果が返されます。カラム定義の中でリストされているのと同じ順番で値を指定する必要があります。
val2
,val1
'
SET
カラムに有効なすべての値を究明したければ、SHOWCOLUMNSFROM
をし、出力の
tbl_name
LIKEset_col
Type
カラムの中の SET
定義を解析してください。