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