MySQL數據庫--枚舉的使用

使用枚舉(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 的處理方式,快捷有效!

可是它也有致命的缺陷,不能減小或修改(包括修改現有的枚舉字符串信息、在中間或最前面插入新的字符串)現有的枚舉列表,只能在後面新增枚舉字符串信息

對於一些了將來可能會改變的字符串,使用枚舉不是一個好主意

相關文章
相關標籤/搜索