ENUM是一个字符串对象,其值来自表建立时在列规定中显式枚举的一列值。mysql
在某些状况下,ENUM值也能够为空字符串('')或NULL:sql
· 若是你将一个非法值插入ENUM(也就是说,容许的值列以外的字符串),将插入空字符串以做为特殊错误值。该字符串与“普通”空字符串不一样,该字符串有数值值0。后面有详细讨论。spa
· 若是将ENUM列声明为容许NULL,NULL值则为该列的一个有效值,而且 默认值为NULL。code
每一个枚举值有一个索引:对象
· 来自列规定的容许的值列中的值从1开始编号。排序
· 空字符串错误值的索引值是0。这说明你可使用下面的SELECT语句来找出分配了非法ENUM值的行:索引
· mysql> SELECT * FROM tbl_name WHERE enum_col=0;
· NULL值的索引是NULL。three
例如,定义为ENUM的列('one','two','three')能够有下面所示任何值。还显示了每一个值的索引:字符串
值table |
索引 |
NULL |
NULL |
'' |
0 |
'one' |
1 |
'two' |
2 |
'three' |
3 |
枚举最多能够有65,535个元素。
当建立表时,ENUM成员值的尾部空格将自动被删除。
当检索时,保存在ENUM列的值使用列定义中所使用的大小写来显示。请注意能够为ENUM列分配字符集和校对规则。对于二进制或大小写敏感的校对规则,当为列分配值时应考虑大小写。
若是在数值上下文中检索一个ENUM值,将返回列值的索引。
例如,你能够这样从ENUM列搜索数值值:
mysql> SELECT enum_col+0 FROM tbl_name;
若是将一个数字保存到ENUM列,数字被视为索引,而且保存的值是该索引对应的枚举成员。(可是,这不适合LOAD DATA,它将全部输入视为字符串)。不建议使用相似数字的枚举值来定义一个ENUM列,由于这很容易引发混淆。例如,下面的列含有字符串值'0'、'1'和'2'的枚举成员,但数值索引值为一、2和3:
numbers ENUM('0','1','2')
根据枚举成员在列定义中列出的顺序对ENUM值进行排序。(换句话说,ENUM值根据索引编号进行排序)。
例如,对于ENUM('a','b'),'a'排在'b'前面,但对于ENUM('b','a'),'b'排在'a'前面。空字符串排在非空字符串前面,而且NULL值排在全部其它枚举值前面。要想防止意想不到的结果,按字母顺序规定ENUM列。还可使用GROUP BY CAST(col AS CHAR) 或 GROUP BY CONCAT(col)来确保按照词汇对列进行排序而不是用索引数字。
若是你想要肯定一个ENUM列的全部可能的值,使用SHOW COLUMNS FROM tbl_name LIKE enum_col,并解析输出中第2列的ENUM定义。