mysql 字段拼接_谈下最近开发中用了一下Mysql的set字段类型

set类型简介

最近项目中使用了set类型去定义一个常量集合字段,为了深入了解该类型用法去官方文档学习了一下并进行了一些用法的尝试。

set是可以具有0到64个值的字符串对象类型(可当集合使用),set列中的值都必须在定义时指定的值列表中选取。set中的每个字符串成员值之间用逗号(,)分隔,所以成员值中不能包含逗号字符串(所以可把set类型列看成通过逗号将成员拼接成完整字符串的列)。

注意事项与剖析操作

操作案例表:

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字段根据定义顺序分配数字存储值并维护一个上下文用于检索与排序,如以上例中定义顺序字符串值与数字映射所生成的上下文如下:
3990b9d15437571020a0a683e3d1c51b.png

可通过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’成员含以下两种方式:
1.select * from dictionary where collection&12.select * from dictionary where find_in_collection('a',collection)
68afdaf28f0d0f41ed788002f3ca2ce4.png

精准查找collection列为’a,d’的数据:select * where collection=9(1+)

6516d84a325851aec95c31ab2d77cddb.png
插入值时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、付费专栏及课程。

余额充值