SET
是一個字串物件,可以有零個或多個值,每個值都必須從建立表格時指定的允許值清單中選擇。由多個集合成員組成的 SET
欄位值會以逗號 ( ,
) 分隔成員來指定。這樣做的後果是,SET
成員值本身不應包含逗號。
例如,指定為 SET('one', 'two') NOT NULL
的欄位可以有以下任何值
''
'one'
'two'
'one,two'
SET
欄位最多可以有 64 個不同的成員。
定義中的重複值會導致警告,如果啟用嚴格 SQL 模式,則會導致錯誤。
建立表格時,結尾空格會自動從表格定義中的 SET
成員值中刪除。
有關 SET
類型語法和長度限制,請參閱 第 13.3.1 節「字串資料類型語法」。
當擷取時,儲存在 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 基本資料結構。