目录
前言
当项目中遇到比较多的枚举字段时怎么选择MySQL的类型呢?tinyint,varchar还是enum?据我观察大家还是用tinyint的比较多,少数也会直接用varchar。
说到枚举,这个类型真的是有点坑,写的时候又不想校验(尤其是枚举值比较多的时候),又想直接在表里可以显示出原字符(说到底还是懒)。tinyint可以校验插入的值为自己定义的数值且索引友好但是显示不友好,varvhar可以直接在表中显示字段值但对索引又不友好。
两种都不是最优选择,后来MySQL出现了enum类型,可以直接显示值且内部为数字索引。本来以为这个enum可以解放我们的双手了,但我调研了一下发现还是有一些大坑的,难怪很少有人用。
enum介绍
先来介绍一下enum类型吧。
ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举。(建表的时候写到建表语句里)
虽然表面是字符串值,但其内部是数字索引,其索引值从1开始。
注意:下标并不是从 0 开始,而 0 则具有其它的意义(空)
ENUM数据类型提供以下优点:
节省存储空间,MySQL ENUM使用数字索引(1,2,3,…)来表示字符串值。
可读查询和输出,数字将转换回查询结果中的相应字符
实践
下面我们来建个表试一下这个enum类型。
CREATE TABLE `test_enum` (
`id` INT ( 11 ) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`color` ENUM('red','yellow','blue') COMMENT '颜色',
PRIMARY KEY ( `id` )
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = '颜色表';
image.gi