[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      |
					+------------+