MySQl 数据类型 ENUM 和 SET

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43054397/article/details/91048642

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中的截图。

  • 插入ENUM 类型 数据

    两种方式:

    • 使用索引值
      INSERT INTO HOBBY VALUES(1);
      
    • 使用选项值字符串
      INSERT INTO HOBBY VALUES("跳舞");
      
      lchh
  • 查询

同样支持两种方式:

  • 使用索引值

    SELECT * FROM HOBBY where hobby = 1;
    

    lchh

  • 使用选项值字符串

    SELECT * FROM HOBBY where hobby = '跳舞';
    

    lchh

  • 在一个数字语境中检索一个ENUM
    SELECT hobby+0 FROM HOBBY;
    
    lchh

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
      

      lchh

    • 使用选项值字符串

      	INSERT INTO SET_test VALUES('跳舞,听音乐'); //这里顺序可以随意
      

      lchh

  • 查询
    • find_in_set() (模糊查询)

      	SELECT * FROM SET_test WHERE FIND_IN_SET('唱歌',hobby)>0;
      

      语句的意思找到SET_test表中 hobby 字段 包含‘唱歌’这一选项的所有成员行。
      lchh

    • like修饰符 (模糊查询)

      	SELECT * FROM SET_test WHERE hobby LIKE '%听音乐%';
      

      语句的意思找到SET_test表中 hobby 字段 包含‘听音乐’这一选项的所有成员行。
      lchh

    • 精确查询

       	SELECT * FROM SET_test WHERE hobby = '听音乐,跳舞';
      
          SELECT * FROM SET_test WHERE hobby = 7;
      

    **注: **将SET值与 ‘听音乐,跳舞’ 比较返回的结果与同 '跳舞,听音乐 ’ 比较返回的结果不同。指定值时的顺序应与在列定义中所列的顺序相同

  • 集合SET中的每个值都有一个顺序排列的编号。MySQL中存入的是这个编号,而不是列表中的值,所以我们可以根据这个编号来进行一些操作
    • 在一个数字语境中检索一个SET
    SELECT hobby+0 FROM SET_test;
    

    lchh

    • 对其进行& | !等位运算
    SELECT * FROM SET_test WHERE hobby & 1;
    

    lchh

猜你喜欢

转载自blog.csdn.net/weixin_43054397/article/details/91048642