[mysql基础文档]-11-数据类型之枚举型
引言
这篇文章介绍两种枚举类型enum和set,枚举类型能限制某些特定列(比如性别列)的插入数据。
文章目录
0×1.MySQL如何创建enum列
● 枚举声明语法ENUM("value1","value2",...),占用1到2字节,同text类型一样,枚举字段仅仅储存的是一个索引值,括号中的每个value都储存在其他的文件中,当索引小于255时占用1字节,当索引在255~65535之间时,占用2字节,理论可以索引65535个value,但实际还受数据库单个文件大小限制。
● 在枚举声明中应尽量避免使用整数(如enum(3,2,1)),因为枚举的索引也是整数,查询时很容易出错,储存整数请使用int类型,或将成员用单引号引起来作为字符串类型储存(例如enum("3","2","1")); 建议不要在索引列中使用空字符或NULL(存入一个枚举中不存在的值也会自动被转换成空字符,索引是0),如果枚举中设定了空字符成员,这时插入一个空字符会得到一个正确的索引值,这两种空字符表面上看起来完全一样,应尽量避免出现这种情况;NULL对应的索引是NULL,其他正常数据的索引是从1开始的,请看下面实例:
--创建表t13,包含一个枚举列enum_column,枚举中给出了两个有效字符串成员,每个成员之间用逗号分隔 mysql> create table t13(enum_column enum('male','female')); --插入一个空字符串到这个枚举列,虽然给出了警告,但仍然插入成功了 mysql> insert into t13 values(''); --插入一个null mysql> insert into t13 values(null); --插入一个有效值 mysql> insert into t13 values('male'); --插入一个输入错误的无效值 mysql> insert into t13 values('famale'); --最后插入另一个有效值 mysql> insert into t13 values('female'); --最后的结果如下,无效值会自动转换成空字符串 mysql> select * from t13; +-------------+ | enum_column | +-------------+ | | | NULL | | male | | | | female | +-------------+ --注意!部分数据库中,插入空字符串和无效值会返回一个错误,插入失败,在这些数据库中,上面的实例,NULL的索引将被设置成1,以此类推。 --使用索引查询,有效值由上往下索引从1开始递增 mysql> select * from t13 where enum_column=1; +-------------+ | enum_column | +-------------+ | male | +-------------+ mysql> select * from t13 where enum_column=2; +-------------+ | enum_column | +-------------+ | female | +-------------+ --直接使用字符串和使用索引的效果是一样的 mysql> select * from t13 where enum_column='male'; +-------------+ | enum_column | +-------------+ | male | +-------------+ --空字符串的索引都是0 mysql> select * from t13 where enum_column=0; +-------------+ | enum_column | +-------------+ | | | | +-------------+ --查询NULL数据要用到is运算符,直接等于是不能查出NULL数据的 mysql> select * from t13 where enum_column=NULL; Empty set (0.00 sec) mysql> select * from t13 where enum_column is NULL; +-------------+ | enum_column | +-------------+ | NULL | +-------------+
● 枚举列数据的修改操作:
--将所有空字符字段修改成male,将所有NULL字段修改成female mysql> update t13 set enum_column='male' where enum_column=0; mysql> update t13 set enum_column='female' where enum_column is null; mysql> select * from t13; +-------------+ | enum_column | +-------------+ | male | | female | | male | | male | | female | +-------------+
P.s:enum尽量避免空字符成员,请看下面实例:
--创建一个包含空字符的枚举 mysql> create table t15(en enum('','hello')); --插入三条记录,其中第一条是空字符,最后一条因为没有包含在枚举中,所以也会自动转换成空字符 mysql> insert into t15 values(''); mysql> insert into t15 values('hello'); mysql> insert into t15 values('sdfaf'); --使用索引1,看到的是空字符,这个空字符是枚举中的空字符 mysql> select * from t15 where en=1; +------+ | en | +------+ | | +------+ --使用索引0也会看到一个空字符,这个空字符是错误数据转化的 mysql> select * from t15 where en=0; +------+ | en | +------+ | | +------+ --如果这样看,根本不知道哪个空字符是错误的数据,所以应该尽量避免这种设计 mysql> select * from t15; +-------+ | en | +-------+ | | | hello | | | +-------+
0×2.MySQL如何创建set列
● set同enum类似,也可以声明多个有效值,但在set列中,插入数据时可以选择多个有效值,set类型占用的字节大小不是固定的,可占用1,2,3,4或8个字节,虽然set有最大8个字节的索引,但实际储存的value还受MySQL最大文件限制。
请看下面实例:
--创建表t14,包含一列,此列包含4个可选成员,插入的数据只能是这些成员中的一个或几个,错误的数据输入同样会被转换成空字符 mysql> create table t14(set_column set('a','b','c','d')); --使用逗号分隔,可以选择多个成员 mysql> insert into t14 values('a,b'); mysql> insert into t14 values('a,d'); mysql> insert into t14 values('a,d,c'); mysql> select * from t14; +------------+ | set_column | +------------+ | a,b | | a,d | | a,c,d | +------------+