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 * FROMmysql>tbl_nameWHERE FIND_IN_SET('value',set_col)>0;SELECT * FROMtbl_nameWHEREset_colLIKE '%value%';
        最初のステートメントは
        set_col が
        value
        セットメンバを含む行を見つけます。二つ目のステートメントも似ていますが、全く同じではありません。2つ目のステートメントは、他のセットメンバの部分列としても、set_col
        が value
        をどこかに含む行を見つけます。
      
次のステートメントもまた正当です。
mysql>SELECT * FROMmysql>tbl_nameWHEREset_col& 1;SELECT * FROMtbl_nameWHEREset_col= 'val1,val2';
        これらのステートメントの最初の部分が最初のセットメンバを含む値を探します。二つ目の部分が正確に適合する値を探します。二つ目のタイプの比較に注意してください。'
        のセット値を比較すると、val1、val2''
        を比較するよりも異なる結果が返されます。カラム定義の中でリストされているのと同じ順番で値を指定する必要があります。
      val2、val1'
        SET
        カラムに有効な全ての値を究明したければ、SHOW
        COLUMNS FROM 
        を利用し、アウトプットの tbl_name LIKE
        set_colType
        カラムの中の SET
        定義を解析してください。
      

