您的位置:首页 > 数据库 > MySQL

MySQL的SET字段类型

2012-05-04 09:49 316 查看
SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个SET成员的SET列值时各成员之间用逗号(‘,’)间隔开。这样SET成员值本身不能包含逗号。
[align=left]例如,指定为SET('one', 'two') NOT NULL的列可以有下面的任何值:[/align]
[align=left]''[/align]
[align=left]'one'[/align]
[align=left]'two'[/align]
[align=left]'one,two'[/align]
[align=left]SET最多可以有64个不同的成员。[/align]
[align=left]当创建表时,SET成员值的尾部空格将自动被删除。[/align]
[align=left]当检索时,保存在SET列的值使用列定义中所使用的大小写来显示。请注意可以为SET列分配字符集和校对规则。对于二进制或大小写敏感的校对规则,当为列分配值时应考虑大小写。[/align]
[align=left]MySQL用数字保存SET值,所保存值的低阶位对应第1个SET成员。如果在数值上下文中检索一个SET值,检索的值的位设置对应组成列值的SET成员。例如,你可以这样从一个SET列检索数值值:[/align]
[align=left]mysql> SELECT set_col+0 FROM tbl_name;[/align]
[align=left]如果将一个数字保存到SET列中,数字中二进制表示中的位确定了列值中的SET成员。对于指定为SET('a','b','c','d')的列,成员有下面的十进制和二进制值:[/align]
[align=left]SET成员[/align]
[align=left]十进制值[/align]
[align=left]二进制值[/align]
[align=left]'a'[/align]
[align=left]1[/align]
[align=left]0001[/align]
[align=left]'b'[/align]
[align=left]2[/align]
[align=left]0010[/align]
[align=left]'c'[/align]
[align=left]4[/align]
[align=left]0100[/align]
[align=left]'d'[/align]
[align=left]8[/align]
[align=left]1000[/align]
[align=left] [/align]
[align=left]如果你为该列分配一个值9,其二进制形式为1001,因此第1个和第4个SET值成员'a'和'd'被选择,结果值为 'a,d'。[/align]
[align=left]对于包含多个SET元素的值,当插入值时元素所列的顺序并不重要。在值中一个给定的元素列了多少次也不重要。当以后检索该值时,值中的每个元素出现一次,根据表创建时指定的顺序列出元素。例如,假定某个列指定为SET('a','b','c','d'):[/align]
[align=left]mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));[/align]
[align=left]插入值'a,d'、'd,a'、'a,d,d'、'a,d,a'和'd,a,d':[/align]
[align=left]mysql> INSERT INTO myset (col) VALUES[/align]
[align=left]-> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');[/align]
[align=left]Query OK, 5 rows affected (0.01 sec)[/align]
[align=left]Records: 5 Duplicates: 0 Warnings: 0[/align]
[align=left]当检索时所有这些值显示为 'a,d':[/align]
[align=left]mysql> SELECT col FROM myset;[/align]
[align=left]+------+[/align]
[align=left]| col |[/align]
[align=left]+------+[/align]
[align=left]| a,d |[/align]
[align=left]| a,d |[/align]
[align=left]| a,d |[/align]
[align=left]| a,d |[/align]
[align=left]| a,d |[/align]
[align=left]+------+[/align]
[align=left]5 rows in set (0.04 sec)[/align]
[align=left]如果将SET列设置为一个不支持的值,则该值被忽略并发出警告:[/align]
[align=left]mysql> INSERT INTO myset (col) VALUES ('a,d,d,s');[/align]
[align=left]Query OK, 1 row affected, 1 warning (0.03 sec)[/align]
[align=left] [/align]
[align=left]mysql> SHOW WARNINGS;[/align]
[align=left]+---------+------+------------------------------------------+[/align]
[align=left]| Level | Code | Message |[/align]
[align=left]+---------+------+------------------------------------------+[/align]
[align=left]| Warning | 1265 | Data truncated for column 'col' at row 1 |[/align]
[align=left]+---------+------+------------------------------------------+[/align]
[align=left]1 row in set (0.04 sec)[/align]
[align=left] [/align]
[align=left]mysql> SELECT col FROM myset;[/align]
[align=left]+------+[/align]
[align=left]| col |[/align]
[align=left]+------+[/align]
[align=left]| a,d |[/align]
[align=left]| a,d |[/align]
[align=left]| a,d |[/align]
[align=left]| a,d |[/align]
[align=left]| a,d |[/align]
[align=left]| a,d |[/align]
[align=left]+------+[/align]
[align=left]6 rows in set (0.01 sec)[/align]
[align=left]SET值按数字顺序排序。NULL值排在非NULL SET值的前面。[/align]
[align=left]通常情况,可以使用FIND_IN_SET()函数或LIKE操作符搜索SET值:[/align]
[align=left]mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;[/align]
[align=left]mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';[/align]
[align=left]第1个语句找出SET_col包含value set成员的行。第2个类似,但有所不同:它在其它地方找出set_col包含value的行,甚至是在另一个SET成员的子字符串中。[/align]
[align=left]下面的语句也是合法的:[/align]
[align=left]mysql> SELECT * FROM tbl_name WHERE set_col & 1;[/align]
[align=left]mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';[/align]
[align=left]第1个语句寻找包含第1个set成员的值。第2个语句寻找一个确切匹配的值。应注意第2类的比较。将set值与'val1,val2'比较返回的结果与同'val2,val1'比较返回的结果不同。指定值时的顺序应与在列定义中所列的顺序相同。[/align]
[align=left]如果想要为SET列确定所有可能的值,使用SHOW COLUMNS FROM tbl_name LIKE set_col并解析输出中第2列的SET定义。[/align]
[align=left]  刚才研究MySQL文档,发现SET类型的真正含义:[/align]
[align=left] [/align]
[align=left]  实际上,SET可以包含最多64个成员,其值为一个整数。这个整数[/align]
[align=left]的二进制码表示该SET的值的哪些成员为真。例如有SET('a','b','c','d'),[/align]
[align=left]那么当它们的值为:[/align]
[align=left] [/align]
[align=left]SET member Decimal value Binary value[/align]
[align=left]-----------------------------[/align]
[align=left]a     1        0001[/align]
[align=left]b     2         0010[/align]
[align=left]c     4        0100[/align]
[align=left]d     8        1000[/align]
[align=left]  如果你将9存入某个SET域,那么其二进制值为1001,也就是说这[/align]
[align=left]个值中'a'和'd'为真。[/align]
[align=left] [/align]
[align=left]  可以想到,如果这样的话,大家可以用LIKE命令和FIND_IN_SET()[/align]
[align=left]函数来检索SET值:[/align]
[align=left] [/align]
[align=left]mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';[/align]
[align=left]mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;[/align]
[align=left] [/align]
[align=left]当然,以下SQL语句也是合法的,他们显得更加简洁:[/align]
[align=left] [/align]
[align=left]mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';[/align]
[align=left]mysql> SELECT * FROM tbl_name WHERE set_col & 1;[/align]
[align=left] [/align]
[align=left]哈哈,这么一来,大家下次控制权限的时候就不用设一个int型,然后[/align]
[align=left]在那里与呀或的,还要另外定义权限的名称,用SET型字段轻松搞定!![/align][align=left]
[/align][align=left]转载:http://blog.sina.com.cn/s/blog_546f2daa0100qjip.html
[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: