top
Loading...
11.4.5.SET類型
11.4.5. SET類型

SET是一個字符串對象,可以有零或多個值,其值來自表創建時規定的允許的一列值。指定包括多個SET成員的SET列值時各成員之間用逗號(,)間隔開。這樣SET成員值本身不能包含逗號。

例如,指定為SET('one', 'two') NOT NULL的列可以有下面的任何值:

''
'one'
'two'
'one,two'

SET最多可以有64個不同的成員。

當創建表時,SET成員值的尾部空格將自動被刪除。

當檢索時,保存在SET列的值使用列定義中所使用的大小寫來顯示。請注意可以為SET列分配字符集和 校對規則。對于二進制或大小寫敏感的校對規則,當為列分配值時應考慮大小寫。

MySQL用數字保存SET值,所保存值的低階位對應第1SET成員。如果在數值上下文中檢索一個SET值,檢索的值的位設置對應組成列值的SET成員。例如,你可以這樣從一個SET列檢索數值值:

mysql> SELECT set_col+0 FROM tbl_name;

如果將一個數字保存到SET列中,數字中二進制表示中的位確定了列值中的SET成員。對于指定為SET('a','b','c','d')的列,成員有下面的十進制和二進制值:

SET成員

十進制值

二進制值

'a'

1

0001

'b'

2

0010

'c'

4

0100

'd'

8

1000

 

如果你為該列分配一個值9,其二進制形式為1001,因此第1個和第4SET值成員'a''d'被選擇,結果值為 'a,d'

對于包含多個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)

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%';

1個語句找出SET_col包含value set成員的行。第2個類似,但有所不同:它在其它地方找出set_col包含value的行,甚至是在另一個SET成員的子字符串中。

下面的語句也是合法的:

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

1個語句尋找包含第1set成員的值。第2個語句尋找一個確切匹配的值。應注意第2類的比較。將set值與'val1,val2'比較返回的結果與同'val2,val1'比較返回的結果不同。指定值時的順序應與在列定義中所列的順序相同。

如果想要為SET列確定所有可能的值,使用SHOW COLUMNS FROM tbl_name LIKE set_col并解析輸出中第2列的SET定義。

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/column-types.html
北斗有巢氏 有巢氏北斗