Enum是枚举类型,每个枚举值都有一个索引,索引一般是从1开始。
CREATE TABLE student(
-> id INT(11) PRIMARY key auto_increment,
-> name VARCHAR(10) not null,
-> sex ENUM('boy','girl','secret') DEFAULT 'secret'
-> )ENGINE=INNODB;
student表的sex字段是一个enum字段。
插入数据:
insert into student values(1,'lbj','boy');
insert into student values(1,'lbj','boys');//报:ERROR 1265 (01000): Data truncated for column 'sex' at row 1错误
因为sex字段只能插入索引值为boy、girl、secret这几个值。有一个例外的值是null。如:
insert into student values(2,'lbj',null);
select * from student;
+----+------+------+
| id | name | sex |
+----+------+------+
| 1 | lbj | boy |
| 2 | lbj | NULL |
+----+------+------+
2 rows in set (0.00 sec)
对Enum枚举类型直接select的话,查到的是枚举值,如:
select sex from student;
+------+
| sex |
+------+
| boy |
| NULL |
+------+
2 rows in set (0.00 sec)
想要查索引值得话,只需要枚举列加0即可:
select sex+0 from student;
+-------+
| sex+0 |
+-------+
| 1 |
| NULL |
+-------+
2 rows in set (0.00 sec)
可以看出null值的索引为null。需要注意的是,这里的索引只是指出枚举表里该元素的位置,和表索引不同。
而且枚举值只能包含定义列时定义的那些值和null,不能是0或者空字符串。
Enum在底层的存储方式是以整形进行存储的,如:拿索引值和枚举值都能查询出数据。
select * from student where sex='boy';
+----+------+------+
| id | name | sex |
+----+------+------+
| 1 | lbj | boy |
+----+------+------+
1 row in set (0.00 sec)
select * from student where sex=1;
+----+------+------+
| id | name | sex |
+----+------+------+
| 1 | lbj | boy |
+----+------+------+
1 row in set (0.00 sec)
enum类型排序:
Enum类型是根据其索引号进行排序,而不是根据索引值进行排序,如:
建表:
CREATE TABLE student2(
-> id INT(11) PRIMARY key auto_increment,
-> name VARCHAR(10) not null,
-> sex ENUM('c','b','a') DEFAULT 'c'
-> )ENGINE=INNODB;
Query OK, 0 rows affected, 1 warning (0.45 sec)
插数据:
insert into student2 values(1,'lbj','a');
insert into student2 values(2,'lbj','b');
insert into student2 values(3,'lbj','c');
insert into student2 values(4,'lbj',null);
查询数据:
select * from student2;
+----+------+------+
| id | name | sex |
+----+------+------+
| 1 | lbj | a |
| 2 | lbj | b |
| 3 | lbj | c |
| 4 | lbj | NULL |
+----+------+------+
4 rows in set (0.00 sec)
查询枚举值索引:
select *,sex+0 from student2;
+----+------+------+-------+
| id | name | sex | sex+0 |
+----+------+------+-------+
| 1 | lbj | a | 3 |
| 2 | lbj | b | 2 |
| 3 | lbj | c | 1 |
| 4 | lbj | NULL | NULL |
+----+------+------+-------+
4 rows in set (0.00 sec)
按sex升序排序:
select * from student2 order by sex asc;
+----+------+------+
| id | name | sex |
+----+------+------+
| 4 | lbj | NULL |
| 3 | lbj | c |
| 2 | lbj | b |
| 1 | lbj | a |
+----+------+------+
4 rows in set (0.00 sec)
可以看出并不是以枚举值进行排序的,而是以枚举索引值进行排序的,枚举索引null被当做了0来看待。
如果我想以枚举值进行排序,应该怎么办呢?
使用cast命令强制order by按枚举值进行排序,如:
select * from student2 order by cast(sex as char);
+----+------+------+
| id | name | sex |
+----+------+------+
| 4 | lbj | NULL |
| 1 | lbj | a |
| 2 | lbj | b |
| 3 | lbj | c |
+----+------+------+
4 rows in set (0.01 sec)