版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
MySQl 数据类型 ENUM 和 SET
ENUM, SET 为 MySQl 中的字符串数据类型,相较于CHAR,VARCHAR 这类随意插入任意字符的字符串类型,ENUM, SET 为 只能在指定的集合里取值 的字符串数据类型。
ENUM(枚举值)
1. 单选字符串数据类型
- 适合存储表单界面中的“单选值”,也就是只能取一个值。
2. 设定ENUM的时候,需要给定 “固定的几个选项”,存储的时候就只存储其中的一个值
- 设定ENUM的格式:
字段名 ENUM ("选项1","选项2","选项3",...);
3. ENUM 的选项都会对应一个索引值
- 按照你定义的顺序依次索引值是 1,2,3,4,5…,最多有 65535 个选项,所以插入数据的时候,可以使用 选项值 或者使用 索引值。
- 在列说明中列表值所允许的成员值被从 1 开始编号。
- 空字符串错误值的索引值为 0。
- NULL 值的索引值为NULL
- 所以,可以使用下面所示的 SELECT 语句找出被赋于无效ENUM值的记录行:
SELECT * FROM 表名 WHERE 字段类型为ENUM的字段名 = 0;
- 如果在一个数字语境中检索一个ENUM,列值的索引值将被返回
SELECT 字段类型为ENUM的字段名+0 FROM 表名;
4. 例子:
CREATE TABLE HOBBY(
hobby ENUM ("听音乐","跳舞","唱歌")
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
选项值 | 索引值 |
---|---|
NULL | NULL |
”“(空字符串) | 0 |
“听音乐” | 1 |
“跳舞” | 2 |
“唱歌” | 3 |
由于测试, 这里只定义一个ENUM类型的字段,以下截图为workbench中的截图。
同样支持两种方式:
-
使用索引值
SELECT * FROM HOBBY where hobby = 1;
-
使用选项值字符串
SELECT * FROM HOBBY where hobby = '跳舞';
SET(集合)
1. 多选字符串数据类型
- 适合存储表单界面的“多选值”;
2. 设定set的时候,同样需要给定“固定的几个选项”,存储的时候,可以存储其中的若干个值;
- 设定SET的格式:
字段名 SET ("选项1","选项2","选项3",...)
3. SET 的选项都会对应一个索引值
-
按照你定义的顺序依次索引值是 1,2,4,8,…,最多有 64 个选项,所以插入数据的时候,可以使用 选项值(多个选项用逗号分隔) 或者使用 多个选项的索引值之和。
注: 多个选项的索引值之和:比如(1+2+4=7)插入数据的时候直接写7,就会把索引值为1,2,4 的三个选项插入进去
-
插入记录时,SET字段中的元素顺序无关紧要。存入MySQL数据库后,数据库系统会自动按照定义时的顺序显示。如果插入的成员中有重复,则只存储一次。
4. 例子:
CREATE TABLE SET_test(
hobby SET ('听音乐','跳舞','唱歌')
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
选项值 | 索引值 |
---|---|
‘听音乐’ | 1 |
‘跳舞’ | 2 |
‘听音乐,跳舞’ | 3 |
‘唱歌’ | 4 |
‘听音乐,唱歌’ | 5 |
‘跳舞,唱歌’ | 6 |
‘听音乐’,‘跳舞’,‘唱歌’ | 7 |
由于测试, 这里只定义一个SET类型的字段,以下截图为workbench中的截图。
-
插入SET 类型 数据
两种方式:
-
使用索引值
INSERT INTO SET_test VALUES(7); // 7 = 1+2+4 也就是二进制的111
-
使用选项值字符串
INSERT INTO SET_test VALUES('跳舞,听音乐'); //这里顺序可以随意
-
-
查询
-
find_in_set() (模糊查询)
SELECT * FROM SET_test WHERE FIND_IN_SET('唱歌',hobby)>0;
语句的意思找到SET_test表中 hobby 字段 包含‘唱歌’这一选项的所有成员行。
-
like修饰符 (模糊查询)
SELECT * FROM SET_test WHERE hobby LIKE '%听音乐%';
语句的意思找到SET_test表中 hobby 字段 包含‘听音乐’这一选项的所有成员行。
-
精确查询
SELECT * FROM SET_test WHERE hobby = '听音乐,跳舞';
SELECT * FROM SET_test WHERE hobby = 7;
**注: **将SET值与 ‘听音乐,跳舞’ 比较返回的结果与同 '跳舞,听音乐 ’ 比较返回的结果不同。指定值时的顺序应与在列定义中所列的顺序相同
-
-
集合SET中的每个值都有一个顺序排列的编号。MySQL中存入的是这个编号,而不是列表中的值,所以我们可以根据这个编号来进行一些操作
- 在一个数字语境中检索一个SET
SELECT hobby+0 FROM SET_test;
- 对其进行& | !等位运算
SELECT * FROM SET_test WHERE hobby & 1;