Mysql set字段类型剖析

set类型简介

最近项目中使用了set类型去定义一个常量集合字段,为了深入了解该类型用法去官方文档学习了一下并进行了一些用法的尝试。
set是可以具有0到64个值的字符串对象类型(可当集合使用),set列中的值都必须在定义时指定的值列表中选取。set中的每个字符串成员值之间用逗号(,)分隔,所以成员值中不能包含逗号(,)字符串(实质即Mysql把成员值通过逗号拼接成一个完整的字符串)。

注意事项与剖析操作

操作案例表:

create table dictionary
(
    id int auto_increment primary key,
    collection set('a', 'c', 'f', 'd', 'e', 'b') not null
);
create index dictionary_collection_index on dictionary (collection);

set集合类型有以下细节需要注意:

  • 当插入成员值重复(如"a,a")时则set列最后结果只有一个(“a”),如果设置严格SQL模式则会报错

  • 成员值中尾随的空格会被删除(“a, b”->“a,b”)

  • mysql将set字段根据定义顺序分配二进制数字存储值并维护一个上下文用于检索与排序,如以上例中定义顺序字符串值与数字映射所生成的上下文如下:

    成员十进制值(collection+0)二进制值
    a10001
    c20010
    f40100
    d81000
    e1610000
    b32100000

    可通过select collection,collection+0 from dictionary查看上表中存储set字段collection存储字符串对应的十进制数字值,如存储字符串为’a,c’,则十进制为3(1+2),Mysql检索式会根据数字值3转换为对应的字符串再进行返回。用例:

    • 查找set列中不含’e’、'b’的数据:select * from dictionary where collection < 16
      查找含’a’成员含以下两种方式:
      select * from dictionary where collection&1
      select * from dictionary where find_in_collection('a',collection)
      
      在这里插入图片描述
    • 精准查找collection列为’a,d’的数据:select * where collection=9
      在这里插入图片描述
  • 插入值时mysql会将值根据set成员的定义顺序进行成员值重排序,如:

    执行数据插入:insert into dictionary (collection) value ('a,b,c,d');
    再进行数据查询,会发现该数据值对应的行结果为:a,c,d,b
    
  • 由于set类型也是一个字符串,所以可以通过like检索,如查找collection列含’c’成员的数据行:select * from dictionary where collection like '%,c,%'

本文主要参考自Mysql官方文档:https://dev.mysql.com/doc/refman/8.0/en/set.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值