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)