MySQL入門教程:ENUM和SET類型
最新學訊:近期OCP認證正在報名中,因考試人員較多請盡快報名獲取最近考試時間,報名費用請聯系在線老師,甲骨文官方認證,報名從速!
我要咨詢MySQL入門教程:ENUM和SET類型,ENUM和SET類型是兩種特殊的字符串類型,它們有很多相似之處,使用方法也是分類系,通常都從一個在表創建時明確列舉的允許值的一張表中選擇,其主要的區別是ENUM列必須是值集合中的一個成員,而SET列可以包括其中的任意成員。
例如,創建如下兩個串列:
color ENUM(“red”,”black”,”green”,”yellow”)
property SET(“car”,”house”,”stock”) NOT NULL
那么color和property可能的值分別為:
color:NULL、”red”、”black”、”green”和”yellow”
而property可能的值就復雜的多:
“”
“car”
“house”
“car,house”
“stock”
“car,stock”
“house,stock”
“car,house,stock”
由于空串可以表示不具備值的集合的任何一個值,所以這也是一個合法的SET值。
ENUM類型可以有65536個成員,而SET類型最多可以有64個成員。
ENUM和SET類型是如何存儲的
ENUM和SET類型在數據庫內部并不是用字符的方式存儲的,而是使用一系列的數字,因此更為高效。
ENUM和SET類型的合法值列表的原則為:
此列表決定了列的可能合法值。
可按任意的大小寫字符插入 ENUM 或 SET 值,但是列定義中指定的串的大小寫字符決定了以后檢索它們時的大小寫。
在 ENUM 定義中的值順序就是排序順序。SET 定義中的值順序也決定了排序順序,但是這個關系更為復雜,因為列值可能包括多個集合成員。
SET 定義中的值順序決定了在顯示由多個集合成員組成的 SET 列值時,子串出現的順序。
對于ENUM列類型,成員是從 1 開始順序編號的。(0 被 MySQL 用作錯誤成員,如果以串的形式表示就是空串。)枚舉值的數目決定了 ENUM 列的存儲大小。一個字節可表示 256 個值,兩個字節可表示 65 536 個值。因此,枚舉成員的最大數目為 65 536(包括錯誤成員),并且存儲大小依賴于成員數目是否多于 256 個。在 ENUM 定義中,可以最多指定 65 535(而不是 65 536)個成員,因為 MySQL 保留了一個錯誤成員,它是每個枚舉的隱含成員。在將一個非法值賦給 ENUM 列時,MySQL 自動將其換成錯誤成員。
對于SET類型,SET 列的集合成員不是順序編號的,而是每個成員對應 SET 值中的一個二進制位。第一個集合成員對應于 0 位,第二個成員對應于 1 位,如此等等。數值 SET 值 0 對應于空串。SET 成員以位值保存。每個字節的 8 個集合值可按此方式存放,因此 SET 列的存儲大小是由集合成員的數目決定的,最多 64 個成員。對于大小為 1 到 8、9 到 16、17 到 24、25 到 32、33 到 64 個成員的集合,其 SET 值分別占用 1、2、3、4 或 8 個字節。
例如,還是上面的例子,我們從一個表中檢索出ENUM和SET列的值,及其對應的數值:
對于ENUM類型的color列
SELECT color,color+0 from my_table
其結果為:
+--------+---------+
| color | color+0 |
+--------+---------+
| NULL | NULL |
| black | 2 |
| green | 3 |
| yellow | 4 |
| red | 1 |
| red | 1 |
| green | 3 |
| green | 3 |
| yellow | 4 |
+--------+---------+
對于SET類型的property列,同樣的
SELECT property,property+0 FROM my_table;
其結果為
+-----------------+------------+
| property | property+0 |
+-----------------+------------+
| 0 |
| house,stock | 6 |
| car,stock | 5 |
| stock | 4 |
| car,house,stock | 7 |
| car,house | 3 |
| house | 2 |
| car,stock | 5 |
| house,stock | 6 |
+-----------------+------------+
你可以仔細了解它們之間的對應關系。
因此,在給列賦值、檢索時,你不僅可以使用值表中的字符串,也可以使用數值來表示一個值,例如下列語句是等價的:
INSERT my_table SET property=’car,house,stock’
INSERT my_table SET property=7
對于ENUM列也同樣如此:
INSERT my_table SET color=’red’;
INSERT my_table SET color=1