SET类型和ENUM类型一样,也是字符串类型的一种。
A SET is a string object that can have zero or more values, each of which must be chosen from a list
of permitted values specified when the table is created. SET column values that consist of multiple set
members are specified with members separated by commas (,). A consequence of this is that SET
member values should not themselves contain commas.
SET的值范围也需要在创建表时显示指定。比如,一个列的数据类型指定为SET(‘one’, ‘two’) NOT NULL,它可以具有以下值:
'one' 'two' 'one,two'
复制
SET类型定义的时候可以包含0~64个成员。根据成员的不同,存储上也有所不同。
- 1~8成员的集合,占1个字节。
- 9~16成员的集合,占2个字节。
- 17~24成员的集合,占3个字节。
- 25~32成员的集合,占4个自己。
- 33~64成员的集合,占8个字节。
SET和ENUM最主要的区别在于SET类型一次可以使用多个成员,而ENUM则只能一个。
下面我们就通过例子来测试下。
root@database-one 23:39: [gftest]> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
Query OK, 0 rows affected (0.03 sec)
root@database-one 23:39: [gftest]> INSERT INTO myset (col) VALUES('a,d');
Query OK, 1 row affected (0.00 sec)
root@database-one 23:39: [gftest]> INSERT INTO myset (col) VALUES('d,a');
Query OK, 1 row affected (0.01 sec)
root@database-one 23:40: [gftest]> INSERT INTO myset (col) VALUES('a,d,a');
Query OK, 1 row affected (0.02 sec)
root@database-one 23:40: [gftest]> INSERT INTO myset (col) VALUES('a,d,d');
Query OK, 1 row affected (0.00 sec)
root@database-one 23:40: [gftest]> INSERT INTO myset (col) VALUES('d,a,d');
Query OK, 1 row affected (0.01 sec)
root@database-one 23:41: [gftest]> INSERT INTO myset (col) VALUES('A');
Query OK, 1 row affected (0.01 sec)
root@database-one 23:41: [gftest]> INSERT INTO myset (col) VALUES('a,C,b,d');
Query OK, 1 row affected (0.00 sec)
root@database-one 23:41: [gftest]> select * from myset;
+---------+
| col |
+---------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
| a |
| a,b,c,d |
+---------+
7 rows in set (0.00 sec)
复制
通过上面可以看到,SET类型的列确实可以接受多个成员,同时:
- 值中的每个元素都只会出现一次
- 插入时元素的顺序无关紧要,会按照在表创建时指定的顺序列出
- 忽略大小写,在存储时将它们都转换成了建表时定义的大/小写
如果插入不在集合范围内的值时,会怎么样呢?我们来试试:
root@database-one 23:52: [gftest]> INSERT INTO myset (col) VALUES('e');
Query OK, 1 row affected, 1 warning (0.00 sec)
root@database-one 23:54: [gftest]> show warnings;
+---------+------+------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'col' at row 1 |
+---------+------+------------------------------------------+
1 row in set (0.01 sec)
root@database-one 23:54: [gftest]> select * from myset;
+---------+
| col |
+---------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
| a |
| a,b,c,d |
| |
+---------+
8 rows in set (0.00 sec)
root@database-one 23:55: [gftest]> INSERT INTO myset (col) VALUES('a,e');
Query OK, 1 row affected, 1 warning (0.00 sec)
root@database-one 23:55: [gftest]> show warnings;
+---------+------+------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'col' at row 1 |
+---------+------+------------------------------------------+
1 row in set (0.00 sec)
root@database-one 23:55: [gftest]> select * from myset;
+---------+
| col |
+---------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
| a |
| a,b,c,d |
| |
| a |
+---------+
9 rows in set (0.00 sec)
复制
通过上面可以看到,插入的值不在集合范围内,会被忽略并且产生警告。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
文章被以下合辑收录
评论
相关阅读
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
3263次阅读
2025-04-25 18:53:11
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
904次阅读
2025-04-25 15:30:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
532次阅读
2025-04-17 17:02:24
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
456次阅读
2025-04-15 23:49:58
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
382次阅读
2025-04-15 14:48:05
MySQL 8.0 OCP 1Z0-908 考试解析指南(二)
JiekeXu
349次阅读
2025-04-30 17:37:37
记录MySQL数据库的一些奇怪的迁移需求!
陈举超
302次阅读
2025-04-15 15:27:53
SQL优化 - explain查看SQL执行计划(下)
金同学
295次阅读
2025-05-06 14:40:00
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
数据库运维之道
290次阅读
2025-04-28 11:01:25
MySQL 8.0 OCP 1Z0-908 考试题解析指南
青年数据库学习互助会
285次阅读
2025-04-30 12:17:54