ENUM和SET数据类型
SET
可以把任意多个字符串组合存入SET字段,MySQL在其内部会对SET集合里的字符串按2的幂次进行编号,这样可以利用各种二进制按位比较出来SET数据,但造成可用空间的巨大浪费,同一个SET字段最多只能容纳64个字符串构成的组合。
一个SET数据占用8个字节,则有8*8=64位,所以每个SET字段最多容纳64个字符串,如有以下set数据集合
{1,2,3,4,5,6,7……64}
这样的话就可以用位操作,如果在字段上存入5,那么就知道是’1′和’3′存入
插入新记录时,SET字段里的字符串顺序无关紧要,存储和查询结果里,哪些字符串按它们在SET集合的定义顺序排列显示
在查询命令中,’='操作符比较SET数据的意思时两组字符串组合完全匹配,如果想查找SET字段包含的某给定字符串的记录,用find_in_set()函数
返回给定字符串’italic’在字段fontattr中的定义顺序,如果大于0,说明在字段中
查找某个ENUM或SET集合里包含哪些成员字符串
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 |
1
2
| alter tablename add color set ( 'red' , 'green' , 'yellow' ) insert tablename(color) values( 'red,green' ) |
在查询命令中,’='操作符比较SET数据的意思时两组字符串组合完全匹配,如果想查找SET字段包含的某给定字符串的记录,用find_in_set()函数
1
| select * from testset where find_in_set( 'italic' ,fontattr)>0 |
1
| describe tablename columnname |
ENUM和SET字段排序时按照它们在ENUM或SET集合的先后顺序,如果要按照字母表顺序,需要转换
1
| select concat(x) as xstr .... order by xstr |