使用枚舉(ENUM)代替字符串類型sql
有時候可使用枚舉代替經常使用的字符串類型,枚舉列能夠把一些不重複的字符串存儲成一個預約義的集合,MySQL在存儲枚舉時很是緊湊,會根據列表值的數量壓縮到1個或2個字節中。MySQL在內部會將每一個值在列表中的位置保存爲整數,而且在.frm文件中保存「數字-字符串」映射關係的「查找表」。測試
下面用一個實例說明相關操做和事項spa
① 新建一個枚舉列測試表3d
CREATE TABLE `enum_test` ( `id` int(6) NOT NULL AUTO_INCREMENT, `e` enum('男','女') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, PRIMARY KEY (`id`) USING BTREE )
② 插入數據code
INSERT INTO `enum_test`(e) VALUES(1),(2); INSERT INTO `enum_test`(e) VALUES('男'),('女'); INSERT INTO `enum_test`(e) VALUES(1),('1'),('女'),(0);
這三種插入方式都OK,0也能夠插入,插入的是一個空字符串'', 而插入的‘數字’也是能夠的blog
當插入的數字或字符串不在枚舉範圍內,則會用0或空字符串代替排序
③ 查詢數據ci
SELECT * from `enum_test`
查詢的結果以下:字符串
查詢時,經過 「列名+0」 便可獲取改值在枚舉中的位置關係,以下嗎的SQL語句io
SELECT id,e,e+0 from `enum_test`
查詢結果
使用起來跟方便,好比存取數字和對應的字符串時,避免了case when 轉換;
注意:enmu列字符串沒法經過order by 排序
SELECT id,e,e+0 from `enum_test` ORDER BY e DESC
查詢的結果是經過枚舉的位置就行排序的,以下圖所示
④ 修改枚舉
ALTER TABLE `enum_test` MODIFY COLUMN `e` enum('男','女','未知'); INSERT INTO `enum_test`(e) VALUES(3); SELECT id,e,e+0 from `enum_test` ;
在枚舉字符串後面添加新的字符串,不影響以前的數據
在枚舉的字符串中間或前面加入新的字符串,會對以前的數據產生影響;位置不變時,改變以前的字符串的信息,以前的數據 「e+1」的值不會產生變化
ALTER TABLE `enum_test` MODIFY COLUMN `e` enum('男','未知','女'); SELECT id,e,e+0 from `enum_test` ; ALTER TABLE `enum_test` MODIFY COLUMN `e` enum('未知','男','女'); SELECT id,e,e+0 from `enum_test` ;
在枚舉的中間插入數據,結果以下圖
在枚舉最前面插入數據,結果以下圖
位置不變,修改枚舉字符串信息 或 減小枚舉字符串現有的數量 ,數據會產生不可逆變化,絕對禁止這樣的操做
ALTER TABLE `enum_test` MODIFY COLUMN `e` enum('男','女1'); SELECT id,e,e+0 from `enum_test`; -- 改回去以後,數據已經發送不可逆轉破壞,沒法找回以前的數據了 ALTER TABLE `enum_test` MODIFY COLUMN `e` enum('男','女' ); SELECT id,e,e+0 from `enum_test`
兩次查詢的結果都以下圖所示
⑤ 修改枚舉列的數據的值
update `enum_test` set e = '男' where id=7; update `enum_test` set e = 1 where id=8 ; update `enum_test` set e = '1' where id=8 ; SELECT id,e,e+0 from `enum_test` ;
查詢的結果以下圖所示
結果顯示,枚舉列數據的修改同插入的傳值方式同樣,挺方便的
總結
採用枚舉列處理select標籤或redio標籤的下拉數據的數據很方便,在處理用數字替代字符串的字段數據時,比 case when 的處理方式,快捷有效!
可是它也有致命的缺陷,不能減小或修改(包括修改現有的枚舉字符串信息、在中間或最前面插入新的字符串)現有的枚舉列表,只能在後面新增枚舉字符串信息
對於一些了將來可能會改變的字符串,使用枚舉不是一個好主意