zt mysql set enum类型介绍
http://blog.sina.com.cn/s/blog_5d2026870100fjdy.html
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> SELECT set_col+0 FROM tbl_name;
如果将一个数字保存到SET列中,数字中二进制表示中的位确定了列值中的SET成员。对于指定为SET('a','b','c','d')的列,成员有下面的十进制和二进制值:
SET成员 |
十进制值 |
二进制值 |
'a' |
1 |
0001 |
'b' |
2 |
0010 |
'c' |
4 |
0100 |
'd' |
8 |
1000 |
如果你为该列分配一个值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值排在非NULL SET值的前面。
通常情况,可以使用FIND_IN_SET()函数或LIKE操作符搜索SET值:
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
第1个语句找出SET_col包含value set成员的行。第2个类似,但有所不同:它在其它地方找出set_col包含value的行,甚至是在另一个SET成员的子字符串中。
下面的语句也是合法的:
mysql> SELECT * FROM tbl_name WHERE set_col & 1;
mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
第1个语句寻找包含第1个set成员的值。第2个语句寻找一个确切匹配的值。应注意第2类的比较。将set值与'val1,val2'比较返回的结果与同'val2,val1'比较返回的结果不同。指定值时的顺序应与在列定义中所列的顺序相同。
如果想要为SET列确定所有可能的值,使用SHOW COLUMNS FROM tbl_name LIKE set_col并解析输出中第2列的SET定义。
ENUM类型
ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。
在某些情况下,ENUM值也可以为空字符串('')或NULL:
· 如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值。该字符串与“普通”空字符串不同,该字符串有数值值0。
· 如果将ENUM列声明为允许NULL,NULL值则为该列的一个有效值,并且默认值为NULL。如果ENUM列被声明为NOT NULL,其默认值为允许的值列的第1个元素。
每个枚举值有一个索引:
· 来自列规定的允许的值列中的值从1开始编号。
· 空字符串错误值的索引值是0。这说明你可以使用下面的SELECT语句来找出分配了非法ENUM值的行:
· mysql> SELECT * FROM tbl_name WHERE enum_col=0;
· NULL值的索引是NULL。
例如,定义为ENUM的列('one','two','three')可以有下面所示任何值。还显示了每个值的索引:
值 |
索引 |
NULL |
NULL |
'' |
0 |
'one' |
1 |
'two' |
2 |
'three' |
3 |
枚举最多可以有65,535个元素。
当创建表时,ENUM成员值的尾部空格将自动被删除。
当检索时,保存在ENUM列的值使用列定义中所使用的大小写来显示。请注意可以为ENUM列分配字符集和校对规则。对于二进制或大小写敏感的校对规则,当为列分配值时应考虑大小写。
如果在数值上下文中检索一个ENUM值,将返回列值的索引。例如,你可以这样从ENUM列搜索数值值:
mysql> SELECT enum_col+0 FROM tbl_name;
如果将一个数字保存到ENUM列,数字被视为索引,并且保存的值是该索引对应的枚举成员。(但是,这不适合LOAD DATA,它将所有输入视为字符串)。不建议使用类似数字的枚举值来定义一个ENUM列,因为这很容易引起混淆。例如,下面的列含有字符串值'0'、'1'和'2'的枚举成员,但数值索引值为1、2和3:
numbers ENUM('0','1','2')
根据枚举成员在列定义中列出的顺序对ENUM值进行排序。(换句话说,ENUM值根据索引编号进行排序)。例如,对于ENUM('a','b'),'a'排在'b'前面,但对于ENUM('b','a'),'b'排在'a'前面。空字符串排在非空字符串前面,并且NULL值排在所有其它枚举值前面。要想防止意想不到的结果,按字母顺序规定ENUM列。还可以使用GROUP BY CAST(col AS CHAR)或GROUP BY CONCAT(col)来确保按照词汇对列进行排序而不是用索引数字。
如果你想要确定一个ENUM列的所有可能的值,使用SHOW COLUMNS FROM tbl_name LIKE enum_col,并解析输出中第2列的ENUM定义。
转载于:https://www.cnblogs.com/zhanghw0354/archive/2012/07/19/2599262.html
zt mysql set enum类型介绍相关推荐
- MYSQL中 ENUM 类型
MYSQL中 ENUM 类型的详细解释 ENUM类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串(&quo ...
- mysql中enum类型
ENUM类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串("") 或 NULL: 如果 ...
- mysql 枚举_是否推荐使用MySQL的enum类型?
使用 MySQL ENUM 作为列的数据类型有两个主要的好处,一是使得数据更紧凑进而节省空间,二是更好的可阅读性.但是,享受这些好处的同时,也要承担 ENUM 所带来的各种负面影响. 我们罗列几个主要 ...
- mysql enum_MySQL数据库中关于ENUM类型的详细解释
MySQL数据库中,因为工作的需求,我们可能会用到ENUM类型,但是由于此类型不是很常用,我们可能对其也不是很了解.没关系,本文我们就对ENUM类型做一些详细的解释,希望能够对您有所帮助. ENUM类 ...
- mysql密码字段类型_MySQL 字段类型
数值 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数. 许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定 ...
- MySQL中enum的用法
ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用. 为什么使用枚举 限定值的取值范围,比如性别(男,女,未知)等. CREATE TABLE `size`(`sex` enum(' ...
- MySQL精选 | 枚举类型ENUM的DDL变更测试
导读 本文深入介绍枚举类型EUNM和集合类型SET.测试基于InnoDB存储引擎上,对MySQL数据库枚举类型ENUM的字段进行DDL变更操作,是否需要重新创建表呢?对数据库的事务处理有何影响?对数据 ...
- MySQL复制类型介绍
MySQL复制类型介绍: (1)同步复制:MASTER提交事务,直到事务在所有的Slave都已提交,此时,才会返回给客户端,事务执行完毕. 缺点:完成一个事务可能会有很大的延迟. slave1 MAs ...
- Java 语言中 Enum 类型的使用介绍
Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...
- enum mysql byte_九、臭名昭著的 MySQL ENUM 类型 ( 上 )
MySQL 中,对于那些取值只有两三个,或者五个以内的值,想必,大多数人使用的应该都是 ENUM 类型吧,而剩下的另一部分人,应该都是使用 TINYINT(1) . 我,就是剩下的那部分人. 一方面我 ...
最新文章
- php接收不到ajax请求参数,我是否需要在ajax请求和接收该请求的php之间编码/解码查询参数?...
- 【深度学习】讲一个深度分离卷积结构和空洞卷积的应用
- 电源系统中纹波和噪声的处理
- django jquery ajax 知识点
- 工作八年总结(转载)
- 浏览器自定义css代码,根据浏览器不同设置CSS
- 漫步凸分析七——凸函数闭包
- ASP.NET版在线客服系统源码 带服务端
- Java中 volatile 关键字的最全总结,赶快给自己查缺补漏吧!
- 液压支架销轴力学计算分析研究_技术 | 篦冷机液压管路问题分析及改造措施
- 伴你装系统系列(上篇):Windows10
- lingo与matlab转换,请教lingo与matlab
- multisim 9013、8050免费下载
- 图像算法工程师面试汇总
- 无法导入android 工程--提示项目已经存在
- sqlserver中返回旬开始日期和结束日期的函数
- 【SSL1607】没有上司的晚会【树形DP】
- 项目管理中的成本绩效方法
- 什么是超视频时代的用户体验法则?
- 浅谈Everdroid流程化机器人设计器
热门文章
- caffe中 solver.prototxt文件
- python+sklearn利用特征文件来训练和测试模型并使用joblib方法持久化存储模型
- 分布排序(distribution sorts)算法大串讲
- matlab物理应用编程,MATLAB在普通物理中的应用
- c++ 协程_深入理解异步I/O+epoll+协程
- cmake ..是什么意思
- 区块链 Fisco bcos 智能合约(12)-Solidity的基础特性
- linux ubuntu 查看历史命令
- kubernetest pod为ContainerCreating、ImagePullBackOff状态 怎么办
- 差分进化算法matlab代码_差分进化算法