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