文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  SET 类型

13.3.6 SET 类型

SET 是一个字符串对象,可以包含零个或多个值,每个值都必须从创建表时指定的允许值列表中选择。SET 列值由多个集合成员组成,成员之间用逗号 (,) 分隔。因此,SET 成员值本身不应包含逗号。

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

Press CTRL+C to copy
'' 'one' 'two' 'one,two'

SET 列最多可以有 64 个不同的成员。

定义中的重复值会导致警告,如果启用了严格 SQL 模式,则会导致错误。

创建表时,会自动删除表定义中 SET 成员值中的尾随空格。

有关 SET 类型的存储需求,请参阅 字符串类型存储需求

有关 SET 类型语法和长度限制,请参阅 第 13.3.1 节 “字符串数据类型语法”

检索时,存储在 SET 列中的值将使用列定义中使用的大小写显示。请注意,可以为 SET 列分配字符集和排序规则。对于二进制或区分大小写的排序规则,在向列分配值时会考虑大小写。

MySQL 以数字形式存储 SET 值,存储值的低位对应于第一个集合成员。如果在数字上下文中检索 SET 值,则检索到的值将设置与构成列值的集合成员相对应的位。例如,您可以像这样从 SET 列中检索数值

Press CTRL+C to copy
mysql> 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 copy
mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));

'c'

Press CTRL+C to copy
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

4

Press CTRL+C to copy
mysql> 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 copy
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)

'd'

8

1000

如果为此列分配值 9,则二进制值为 1001,因此将选择第一个和第四个 SET 值成员 'a''d',结果值为 'a,d'

Press CTRL+C to copy
mysql> 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 copy
mysql> SELECT * FROM tbl_name WHERE set_col & 1; mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';

则检索时所有这些值都显示为 'a,d'

如果将 SET 列设置为不受支持的值,则该值将被忽略,并发出警告

如果启用了严格 SQL 模式,则尝试插入无效的 SET 值将导致错误。


SET 值按数字顺序排序。NULL 值排在非 NULLSET 值之前。