文档首页
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 的列可以具有以下任何值

''
'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
1 2 0010
0001 4 0100
'b' 8 1000

2

0010

mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));

'c'

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

mysql> SELECT col FROM myset;
+------+
| col  |
+------+
| a,d  |
| a,d  |
| a,d  |
| a,d  |
| a,d  |
+------+
5 rows in set (0.04 sec)

0100

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'

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'

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 值之前。