[转帖]mysql set 类型字段_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2200 | 回复: 0   主题: [转帖]mysql set 类型字段        下一篇 
lichuan128
注册用户
等级:新兵
经验:71
发帖:58
精华:1
注册:2011-8-31
状态:离线
发送短消息息给lichuan128 加好友    发送短消息息给lichuan128 发消息
发表于: IP:您无权察看 2014-12-1 10:56:50 | [全部帖] [楼主帖] 楼主

SET类型

SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个SET成员的SET列值时各成员之间用逗号(‘,’)间隔开。所以SET成员值本身不能包含逗号。

例如,指定为SET('one', 'two') NOT NULL的列可以有下面的任何值:

''
'one'
'two'
'one,two'


SET最多可以有64个不同的成员。

当创建表时,SET成员值的尾部空格将自动被删除。

当检索时,保存在SET列的值使用列定义中所使用的大小写来显示。请注意可以为SET列分配字符集和校对规则。对于二进制或大小写敏感的校对规则,当为列分配值时应考虑大小写。

MySQL用数字保存SET值,所保存值的低阶位对应第1个SET成员。如果在数值上下文中检索一个SET值,检索值的位置对应组成列值的SET成员。例如,你可以这样从一个SET列检索数值值:

mysql>SELECTset_col+0 FROMtbl_name;


如果将一个数字保存到SET列中,数字中二进制表示中的位确定了列值中的SET成员。对于指定为SET('a','b','c','d')的列,成员有下面的十进制和二进制值:

如果你为该列分配一个值9,其二进制形式为1001,因此第1个和第4个SET值成员'a'和'd'被选择,结果值为'a,d'。

对于包含多个SET元素的值,当插入值时元素所列的顺序并不重要。在值中一个给定的元素列了多少次也不重要。当以后检索该值时,值中的每个元素出现一次,根据表创建时指定的顺序列出元素。例如,假定某个列指定为SET('a','b','c','d'):

mysql>CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));


插入值'a,d'、'd,a'、'a,d,d'、'a,d,a'和'd,a,d':

mysql>INSERT INTO myset (col) VALUES
-> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0


当检索时所有这些值显示为'a,d':

mysql>SELECT col FROM myset;
+------+
| col |
+------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+------+
5 rows in set (0.04 sec)


如果将SET列设置为一个不支持的值,则该值被忽略并发出警告:

mysql>INSERT INTO myset (col) VALUES ('a,d,d,s');
Query OK, 1 row affected, 1 warning (0.03 sec)
mysql>SHOW WARNINGS;
+---------+------+------------------------------------------+
| Level  | Code | Message                                 |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'col' at row 1 |
+---------+------+------------------------------------------+
1 row in set (0.04 sec)
mysql>SELECT col FROM myset;
+------+
| col |
+------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+------+
6 rows in set (0.01 sec)


SET值按数字顺序排序。NULL值排在非NULLSET值的前面。

通常情况,可以使用FIND_IN_SET()函数或LIKE操作符搜索SET值:

mysql>SELECT * FROMtbl_nameWHERE FIND_IN_SET('value',set_col)>0;
mysql>SELECT * FROMtbl_nameWHEREset_colLIKE '%value%';


第1个语句找出SET_col包含valueset成员的行。第2个类似,但有所不同:它在其它地方找出set_col包含value的行,甚至是在另一个SET成员的子字符串中。

下面的语句也是合法的:

mysql>SELECT * FROMtbl_nameWHEREset_col& 1;
mysql>SELECT * FROMtbl_nameWHEREset_col= 'val1,val2';


第1个语句寻找包含第1个set成员的值。第2个语句寻找一个确切匹配的值。应注意第2类的比较。将set值与'val1,val2'比较返回的结果与同'val2,val1'比较返回的结果不同。指定值时的顺序应与在列定义中所列的顺序相同。

如果想要为SET列确定所有可能的值,使用SHOW COLUMNS FROMtbl_nameLIKEset_col并解析输出中第2列的SET定义。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论