Total Pageviews

Tuesday, 7 May 2013

MySQL下的ENUM和SET数据类型

ENUM和SET数据类型

ENUM

管理一个成员多达65535个的字符串集合,集合中每个字符串都有一个顺序排列的编号,而MySQL实际存入ENUM数据列的正是这些编号而不是字 符串本身。ENUM数据列每个字段只能存入一个字符串。在涉及字符串比较操作时,MySQL不区分ENUM数据的字母大小写情况。空白字符串(注意,不是 空字符串)总是可以存入ENUM字段,但只有不带not null属性的ENUM数据列才允许null(空字符串)存入。
SET
可以把任意多个字符串组合存入SET字段,MySQL在其内部会对SET集合里的字符串按2的幂次进行编号,这样可以利用各种二进制按位比较出来SET数据,但造成可用空间的巨大浪费,同一个SET字段最多只能容纳64个字符串构成的组合。
一个SET数据占用8个字节,则有8*8=64位,所以每个SET字段最多容纳64个字符串,如有以下set数据集合
{1,2,3,4,5,6,7……64}
SET成员 十进制值 二进制值
’1′ 1 00000…….0000001
’2′ 2 00000…….0000010
’3′ 4 00000…….0000100
’64′ 2^63 10000………000000
这样的话就可以用位操作,如果在字段上存入5,那么就知道是’1′和’3′存入
1
2
alter tablename add color set ('red','green','yellow')
insert tablename(color) values('red,green')
插入新记录时,SET字段里的字符串顺序无关紧要,存储和查询结果里,哪些字符串按它们在SET集合的定义顺序排列显示
在查询命令中,’='操作符比较SET数据的意思时两组字符串组合完全匹配,如果想查找SET字段包含的某给定字符串的记录,用find_in_set()函数
1
select * from testset where find_in_set('italic',fontattr)>0
返回给定字符串’italic’在字段fontattr中的定义顺序,如果大于0,说明在字段中
1
describe tablename columnname
查找某个ENUM或SET集合里包含哪些成员字符串
ENUM和SET字段排序时按照它们在ENUM或SET集合的先后顺序,如果要按照字母表顺序,需要转换
1
select  concat(x) as xstr .... order by xstr