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 的处理方式,快捷有效!

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

对于一些了将来可能会改变的字符串,使用枚举不是一个好主意

相关文章
相关标签/搜索