mysql enum

CREATE TABLE t_enum_example ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(10) DEFAULT NULL, color enum(‘blue’,’green’,’red’) DEFAULT NULL, PRIMARY KEY (id) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1;



color 字段用 ENUM 类型来定义。ENUM 字段显示的是字符串,但是底层是用整型保存的,每个枚举值都有一个对应的索引,从 1 开始



该不该用 ENUM 类型来定义字段呢,我觉得最好不要用,只要有下面几个点:1、容易混淆因为ENUM 字段底层其实是用整型来存储,比如如果用 ENUM 来存储字符串 ‘3’、’2’、’1’ 这样的数字字符串,那对应的索引就是 1、2、3,要是不熟悉的开发人员,很容易就会造成混淆,新增错误的数据。2、修改字段频繁我们知道对于枚举类型,是很有可能会随时增加的,比如上面例子中的 color 字段,要增加一种颜色 ‘black’,那就要修改字段,给字段的枚举类型增加一种颜色枚举。如果每增加一个枚举,就要修改字段,那代价就太大了。所以一般这种存储类型的字段建议用 TINYINT 来存储。



使用 MySQL ENUM 作为列的数据类型有两个主要的好处,一是使得数据更紧凑进而节省空间,二是更好的可阅读性。但是,享受这些好处的同时,也要承担 ENUM 所带来的各种负面影响。我们罗列几个主要的负面在此,并在接下来的内容中对它们做一一解释千万不要使用数字作为枚举值,因为这样容易混淆它们的字面值和内部索引值。在 ORDER BY 语句中使用 ENUM 更要注意创建和使用 ENUM 数据类型的一些问题枚举值字面量和内部索引的问题处理枚举值字面量的一些问题ENUM 类型中的 NULL 或空值问题ENUM 类型的排序问题ENUM 类型的一些限制
https://www.zhihu.com/question/404422255
https://www.twle.cn/c/yufei/mysqlfav/mysqlfav-basic-enum2.html

https://www.cnblogs.com/lvdongjie/p/4831702.html
ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举。



在下列某些情况下,值也可以是空串(“”) 或 NULL:



如果将一个无效值插入一个 ENUM (即,一个不在允许值列表中的字符串),空字符串将作为一个特殊的错误值被插入。事实上,这个字符串有别于一个”普通的”空字符串,因为这个字符串有个数字索引值为 0。稍后有更详细描述。
如果一个 ENUM 被声明为 NULL,NULL 也是该列的一个合法值,并且该列的缺省值也将为NULL 。如果一个 ENUM 被声明为 NOT NULL,该列的缺省值将是该列表所允许值的第一个成员。
每个枚举值均有一个索引值:



在列说明中列表值所允许的成员值被从 1 开始编号。
空字符串错误值的索引值为 0。这就意味着,你可以使用下面所示的 SELECT 语句找出被赋于无效 ENUM 值的记录行。
mysql> SELECT * FROM tbl_name WHERE enum_col=0;
NULL 值的索引值为 NULL。



换个枚举最大可以有 65535 个成员值。



从 MySQL 3.23.51 开始,当表被创建时,ENUM 值尾部的空格将会自动删除。



当为一个 ENUM 列赋值时,字母的大小写是无关紧要的。然而,以后从列中检索出来的值的大小写却是匹配于创建表时所指定的允许值。



如果在一个数字语境中检索一个ENUM,列值的索引值将被返回。例如,你可以像这样使用数字值检索一个 ENUM 列:



mysql> SELECT enum_col+0 FROM tbl_name;
如果将一个数字存储到一个 ENUM 中,数字被当作为一个索引值,并且存储的值是该索引值所对应的枚举成员。(但是,这在 LOAD DATA 将不能工作,因为它视所有的输入均为字符串。) 在一个ENUM 字符串中存储数字是不明智的,因为它可能会打乱思维。



ENUM 值依照列规格说明中的列表顺序进行排序。(换句话说,ENUM 值依照它们的索引号排序。)举例来说,对于 ENUM(“a”, “b”) “a” 排在 “b” 后,但是对于 ENUM(“b”, “a”) , “b” 却排在 “a”之前。空字符串排在非空字符串前,NULL 值排在其它所有的枚举值前。为了防止意想不到的结果,建议依照字母的顺序定义 ENUM 列表。也可以通过使用 GROUP BY CONCAT(col) 来确定该以字母顺序排序而不是以索引值。



如果希望得到一个 ENUM 列的所有可能值,可以使用 SHOW COLUMNS FROM table_name LIKE enum_colum



Category storage