MySQL 5.1 リファレンスマニュアル :: 10 データタイプ :: 10.4 文字列タイプ :: 10.4.5 SET タイプ
« 10.4.4 ENUM タイプ

10.5 データタイプが必要とする記憶容量 »
Section Navigation      [Toggle]
  • 10.4 文字列タイプ
  • 10.4.1 CHAR と VARCHAR タイプ
  • 10.4.2 BINARY と VARBINARY タイプ
  • 10.4.3 BLOBとTEXT タイプ
  • 10.4.4 ENUM タイプ
  • 10.4.5 SET タイプ

10.4.5. SET タイプ

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 tbl_name WHERE FIND_IN_SET('value',set_col)>0;
mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';

最初のステートメントは set_col が value セットメンバを含む行を見つけます。二つ目のステートメントも似ていますが、全く同じではありません。2つ目のステートメントは、他のセットメンバの部分列としても、set_col が value をどこかに含む行を見つけます。

次のステートメントもまた正当です。

mysql> SELECT * FROM tbl_name WHERE set_col & 1;
mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';

これらのステートメントの最初の部分が最初のセットメンバを含む値を探します。二つ目の部分が正確に適合する値を探します。二つ目のタイプの比較に注意してください。'val1、val2' のセット値を比較すると、'val2、val1' を比較するよりも異なる結果が返されます。カラム定義の中でリストされているのと同じ順番で値を指定する必要があります。

SET カラムに有効な全ての値を究明したければ、SHOW COLUMNS FROM tbl_name LIKE set_col を利用し、アウトプットの Type カラムの中の SET 定義を解析してください。

Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates