SET
是一個字串物件,可以有零個或多個值,每個值必須從建立表格時指定的允許值清單中選擇。SET
欄位值由多個集合成員組成,這些成員以逗號 (,
) 分隔。這樣做的結果是,SET
成員值本身不應包含逗號。
例如,指定為 SET('one', 'two') NOT NULL
的欄位可以具有以下任何值
''
'one'
'two'
'one,two'
SET
欄位最多可以有 64 個不同的成員。
定義中的重複值會導致警告,如果啟用嚴格 SQL 模式,則會導致錯誤。
建立表格時,會自動從表格定義中的 SET
成員值中刪除尾隨空格。
請參閱第 13.3.1 節,「字串資料類型語法」,瞭解 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 |
如果您為此欄位指派值 9
,也就是二進位中的 1001
,則會選取第一個和第四個 SET
值成員 '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)
如果啟用嚴格 SQL 模式,則嘗試插入無效的 SET
值會導致錯誤。
SET
值會依數值排序。NULL
值會排在非 NULL
SET
值之前。
需要數值引數的函數,例如 SUM()
或 AVG()
,會在必要時將引數轉換為數值。對於 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
集合成員的列。第二個陳述式類似,但並不相同:它會尋找 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
定義。
在 C API 中,SET
值會以字串形式傳回。如需瞭解如何使用結果集的中繼資料來區分它們與其他字串,請參閱 C API 基本資料結構。