SET
是一个字符串对象,可以包含零个或多个值,每个值都必须从创建表时指定的允许值列表中选择。SET
列值由多个集合成员组成,成员之间用逗号 (,
) 分隔。因此,SET
成员值本身不应包含逗号。
例如,指定为 SET('one', 'two') NOT NULL
的列可以具有以下任何值
Press CTRL+C to copy'' 'one' 'two' 'one,two'
SET
列最多可以有 64 个不同的成员。
定义中的重复值会导致警告,如果启用了严格 SQL 模式,则会导致错误。
创建表时,会自动删除表定义中 SET
成员值中的尾随空格。
有关 SET
类型语法和长度限制,请参阅 第 13.3.1 节 “字符串数据类型语法”。
检索时,存储在 SET
列中的值将使用列定义中使用的大小写显示。请注意,可以为 SET
列分配字符集和排序规则。对于二进制或区分大小写的排序规则,在向列分配值时会考虑大小写。
MySQL 以数字形式存储 SET
值,存储值的低位对应于第一个集合成员。如果在数字上下文中检索 SET
值,则检索到的值将设置与构成列值的集合成员相对应的位。例如,您可以像这样从 SET
列中检索数值
Press CTRL+C to copymysql> SELECT set_col+0 FROM tbl_name;
如果将数字存储到 SET
列中,则在该数字的二进制表示形式中设置的位将确定列值中的集合成员。对于指定为 SET('a','b','c','d')
的列,成员具有以下十进制和二进制值。
SET 成员 |
十进制值 | 二进制值 |
---|---|---|
'a' |
1 |
0001 |
1 |
2 |
0010 |
0001 |
4 |
0100 |
'b' |
8 |
1000 |
2
0010
Press CTRL+C to copymysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
'c'
Press CTRL+C to copymysql> 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
4
Press CTRL+C to copymysql> SELECT col FROM myset; +------+ | col | +------+ | a,d | | a,d | | a,d | | a,d | | a,d | +------+ 5 rows in set (0.04 sec)
0100
Press CTRL+C to copymysql> 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)
'd'
8
1000
如果为此列分配值 9
,则二进制值为 1001
,因此将选择第一个和第四个 SET
值成员 'a'
和 'd'
,结果值为 'a,d'
。
Press CTRL+C to copymysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0; mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
对于包含多个 SET
元素的值,插入值时元素的列出顺序无关紧要。值中给定元素列出的次数也无关紧要。以后检索值时,值中的每个元素都会出现一次,并按照创建表时指定的顺序列出。假设列指定为 SET('a','b','c','d')
如果插入值 'a,d'
、'd,a'
、'a,d,d'
、'a,d,a'
和 'd,a,d'
Press CTRL+C to copymysql> SELECT * FROM tbl_name WHERE set_col & 1; mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
则检索时所有这些值都显示为 'a,d'
如果将 SET
列设置为不受支持的值,则该值将被忽略,并发出警告
如果启用了严格 SQL 模式,则尝试插入无效的 SET
值将导致错误。