mysql enum字段

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章