SET 型は、ゼロ以上の値を持つことができる文字列オブジェクトです。これらの値はいずれもテーブルの作成時に指定された使用可能な値のリストから選択する必要があります。SET 型のカラム値が複数の要素で構成される場合は、各要素間をカンマ(',')で区切ります。このことから、SET 要素の値自体には、カンマを使用できません。
たとえば、SET("one", "two") NOT NULL として指定されたカラムは、次に示す値のいずれかを取ります。
"" "one" "two" "one,two"
SET には最大 64 個の異なる要素を組み込むことができます。
3.23.51 以降、SET 値の後続のスペースはテーブルの作成時に自動で削除されます。
MySQL では、SET 値は数値として格納されます。格納値の最下位のビットが最初のセット要素に対応します。SET 値を数値型のコンテキストで取り出すと、取り出される値は、カラム値を構成するセット要素に対応するビットセットを持ちます。たとえば、次のように、SET 型のカラムから数値を取り出すことができます。
mysql> SELECT set_col+0 FROM tbl_name;
SET 型のカラムに数値を格納する場合、その数値のバイナリ表現に設定されたビットによって、カラム値のセット要素が決まります。たとえば、カラムが SET("a","b","c","d") として指定されているとします。この場合、セット要素は次のビット値を持ちます。
SET 要素 | 10 進数 | 2 進数 |
a | 1 | 0001 |
b | 2 | 0010 |
c | 4 | 0100 |
d | 8 | 1000 |
このカラムに値 9 を割り当てた場合、2 進数では 1001 になるため、SET 値の 1 番目と 4 番目の要素である "a" と "d" が選択され、結果の値は "a,d" になります。
SET 要素を複数持つ値では、値の挿入時には、要素を列記する順序は重要ではありません。値の中で特定の要素を列記する回数も重要ではありません。
その後、値を取り出すときには、値内の各要素は 1 回のみ出現し、テーブルの作成時に指定された順序でそれぞれの要素が列記されます。たとえば、カラムが SET("a","b","c","d") として指定されている場合、このカラムの値を取り出したときには、"a,d"、"d,a"、"d,a,a,d,d" はいずれも "a,d" として表現されます。
SET 型のカラムに非サポート値を設定すると、その値は無視されます。
SET 型の値は数値としてソートされます。NULL 値は非 NULL SET 値より前にソートされます。
次に示すように、通常、SET 型のカラムに対する SELECT 操作には、LIKE 演算子または FIND_IN_SET() 関数を使用します。
mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
次のステートメントも有効です。
mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2'; mysql> SELECT * FROM tbl_name WHERE set_col & 1;
これらのステートメントの最初のものでは、完全に一致するものが検索されます。2 番目のステートメントでは、最初のセット要素を持つ値が検索されます。
SET 型のカラムの使用可能なすべての値が必要な場合は、SHOW COLUMNS FROM table_name LIKE set_column_name を使用し、2 番目のカラムで SET 定義を解析します。