mysql 列舉(ENUM)型別

2021-09-10 07:09:32 字數 2095 閱讀 2320

童鞋們好,今天我們來總結概括一下列舉型別。

單選字串資料型別,適合儲存表單介面中的「單選值」。

設定enum的時候,需要給定「固定的幾個選項」;儲存的時候就只儲存其中的乙個 值。設定enum的格式:enum(「選項1」,「選項2」,「選項3」,…);

一般會根據列表值得資料壓縮到1-2位元組,mysql的內部會將每個值在列表中的位置儲存為整數,並且在表的.frm檔案中儲存 「數字-字串」 對映關係的「查詢表」。如下

query ok, 0 rows affected (0.07 sec)

query ok, 3 rows affected (0.03 sec)

mysql> select * from enum_test;

+-------+

| e |

+-------+

| fish |

| dog |

+-------+

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。

列舉型別(enum)

enum 是計算機程式語言中的一種資料型別 列舉型別。應用場景 有些變數的取值被要求在乙個確定的範圍內,例如一周有 7天,一年 12個月,或者使用者自定義的今天安排要學習的百家姓有 4個等等。定義 在列舉型別的定義中列舉出所有的可能取值,該變數的取值只能是所列舉的範圍。格式 enum 列舉名 enu...

enum列舉型別。

列舉 定義常量符號,就是巨集定義常數的集合體 比如 四季,星期,意義相關的常數 狀態機 1 根據當前狀態,這個週期結束,就成了下乙個狀態。2 根據你的當前狀態,還和你的輸入有關。比如 fpga,gui 通過列舉,可以將一些常量賦值給某些固定的字串常量。可以通過改變列舉型別的狀態來達到自己的一些目的。...

enum列舉型別

public enum mm aa,bb,cc,dd enum列舉定義好之後,經過編譯後,會變成乙個類,類裡面包含了所有的列舉常量,對於每個列舉常量,主要包含了2個內容 name 和 ordinal,name就是名字,比如上面的 aa,bb 這些就是名字,ordinal 是 int 型別,儲存的是位...