童鞋们好,今天我们来总结概括一下枚举类型。
- 单选字符串数据类型,适合存储表单界面中的“单选值”。
- 设定enum的时候,需要给定“固定的几个选项”;存储的时候就只存储其中的一个 值。设定enum的格式:enum(“选项1”,“选项2”,“选项3”,…);
- 一般会根据列表值得数据压缩到1-2字节,mysql的内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存 “数字-字符串” 映射关系的“查找表”。如下
备注:
从1-fish 2-apple 3-dog 开始最多有65535个选项
mysql> create table enum_test(e enum('fish','apple','dog') not null);
Query OK, 0 rows affected (0.07 sec)
mysql> insert into enum_test(e) values('fish'),('dog'),('apple');
Query OK, 3 rows affected (0.03 sec)
mysql> select * from enum_test;
+-------+
| e |
+-------+
| fish |
| dog |
| apple |
+-------+
3 rows in set (0.02 sec)
mysql> select e+0 from enum_test;
+-----+
| e+0 |
+-----+
| 1 |
| 3 |
| 2 |
+-----+
3 rows in set (0.01 sec)
mysql> select e from enum_test where e= 'fish';
+------+
| e |
+------+
| fish |
+------+
1 rows in set (0.04 sec)
mysql> select e from enum_test where e= 1;
+------+
| e |
+------+
| fish |
+------+
1 rows in set (0.04 sec)
这样如果按上面插入数字(1,2,3),会引起混乱。
- 数据迁移的时候,他几乎不可能被其他数据库所支持,如上面会引起混乱。enum虽然可以存储字符串,但对于内部来说,还是以顺序进行索引。如上。如果你看明白了上面的SQL为什么等义,那么你也就可以了解为什么不主张用enum字段了。
- enum的区间也是可以变动的,如果你在enum的枚举字段范围中加一个值,并且不是加在最后,那么也就相当于,你把原来的范围都改变了索引值,试想这又是多么一个恐怖的事情
- 系统中真的已经使用了mysql的enum字段类型,请在查询的时候直接查询值(并加上单引号),这样就不会使用enum自身隐藏的索引值来获取结果了
- 如果一个设计不合理的ENUM字段,给程序员带来的就完全是梦魇,如下
mysql> create table enum_test4(e enum('0','1','2','3'));
Query OK, 0 rows affected (0.08 sec)
我插入的数值是1.
mysql> insert into enum_test4(e) values(1);
Query OK, 1 rows affected (0.04 sec)
返回的索引是1 ,因为索引是从请开始
mysql> select e+0 from enum_test4;
+------+
| e+0 |
+------+
| 1 |
+------+
1 rows in set (0.02 sec)
插入的却是0.噩梦
mysql> select e from enum_test4;
+------+
| e |
+------+
| 0 |
+------+
1 rows in set (0.03 sec)
总结:
- 如果是纯数值型,还是建议采用tinyint字段吧,毕竟它也只占一个字节,即使出现赃数据,也可以被接受,不象enum,如果纯数字型范围,更改了索引,你就不知道你查询的值是否正确了
- 如果字段是字符串,并且长度固定,可以尝试用char。