文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  SET 類型

13.3.6 SET 類型

SET 是一個字串物件,可以有零個或多個值,每個值都必須從建立表格時指定的允許值清單中選擇。由多個集合成員組成的 SET 欄位值會以逗號 ( , ) 分隔成員來指定。這樣做的後果是,SET 成員值本身不應包含逗號。

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

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

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

定義中的重複值會導致警告,如果啟用嚴格 SQL 模式,則會導致錯誤。

建立表格時,結尾空格會自動從表格定義中的 SET 成員值中刪除。

有關 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 基本資料結構