一个枚举
是一个字符串对象,其值从创建表时在列规范中显式枚举的允许值列表中选择。
看到第11.3.1节“字符串数据类型语法”为枚举
类型语法和长度限制。
的枚举
类型有以下优点:
在列的可能值集有限的情况下的紧凑数据存储。指定为输入值的字符串将自动编码为数字。看到第11.7节“数据类型存储要求”对于存储的要求
枚举
类型。可读查询和输出。在查询结果中,这些数字被翻译回相应的字符串。
还有这些需要考虑的潜在问题:
枚举值必须是带引号的字符串字面值。例如,您可以使用枚举
列如下:
CREATE TABLE衬衫(名称VARCHAR(40),尺寸ENUM('x-small', 'small', 'medium', 'large', 'x-large'));VALUES('正装衬衫','大号'),('t恤','中号'),('polo衬衫','小号');SELECT name FROM shirt WHERE size = 'medium';+---------+--------+ | 名称|大小 | +---------+--------+ | t恤|中 | +---------+--------+ 更新衬衫组大小=‘小’,大小=“大”;提交;
将100万行插入此表,其值为“媒介”
是否需要100万字节的存储,而如果存储实际的字符串则需要600万字节“媒介”
在一个VARCHAR
列。
每个枚举值都有一个索引:
列规范中列出的元素被分配了索引号,从1开始。
空字符串错误值的索引值为0。这意味着您可以使用以下内容
选择
语句来查找无效的行枚举
值被分配:mysql> SELECT * FROMtbl_name在哪里enum_col= 0;
的索引
零
值是零
.这个词”指数”这里指枚举值列表中的位置。它与表索引无关。
例如,指定为的列枚举(“汞”,“金星”,“地球”)
可以具有这里显示的任何值。还显示了每个值的索引。
价值 | 指数 |
---|---|
零 |
零 |
'' |
0 |
“水星” |
1 |
“金星” |
2 |
“地球” |
3. |
一个枚举
列最多可以有65,535个不同的元素。
如果你检索枚举
值,则返回列值的索引。例如,您可以从枚举
列如下:
mysql >选择enum_col+ 0的tbl_name;
自动删除尾随空格枚举
创建表时,表定义中的成员值。
检索时,存储在枚举
使用列定义中使用的字母大小写显示列。请注意,枚举
可以为列分配字符集和排序规则。对于二进制或区分大小写的排序规则,在为列赋值时要考虑字母大小写。
如果你将一个数字存储在枚举
列中,数字被视为可能值的索引,存储的值是具有该索引的枚举成员。(然而,这不一起工作加载数据
,它将所有输入都视为字符串。)如果数值加了引号,如果枚举值列表中没有匹配的字符串,则它仍然被解释为索引。由于这些原因,不建议定义枚举
列的枚举值看起来像数字,因为这很容易使人混淆。例如,以下列的枚举成员的字符串值为' 0 '
,' 1 '
,' 2 '
的数值索引值1
,2
,3.
:
数字ENUM(“0”,“1”,“2”)
如果你商店2
,它被解释为一个索引值,并变成' 1 '
(索引为2的值)' 2 '
,它匹配一个枚举值,因此它被存储为' 2 '
.如果你商店“3”
,它不匹配任何枚举值,因此它被视为索引,并变成' 2 '
(索引为3的值)。
mysql> INSERT INTO t (numbers) VALUES(2),('2'),('3');mysql> SELECT * FROM;+---------+ | 数字 | +---------+ | 1 | 2 | | | 2 | +---------+
求an的所有可能值枚举
列,使用显示列
并解析tbl_name
像‘enum_col
'枚举
定义的类型
列的输出。
在C API中,枚举
值作为字符串返回。有关使用结果集元数据将结果集元数据与其他字符串区分开来的信息,请参见C API基本数据结构.
枚举值也可以是空字符串(''
)或零
在某些情况下:
方法中插入无效值
枚举
(即,不存在于允许值列表中的字符串),则插入空字符串作为特殊的错误值。这个字符串可以与a区分开来”正常的”空字符串,因为该字符串的数值为0。看到枚举字面量的索引值有关枚举值的数字索引的详细信息。如果启用了严格SQL模式,则尝试插入无效
枚举
值会导致错误。如果一个
枚举
列声明为允许零
,零
Value为该列的有效值,默认值为零
.如果一个枚举
列声明非空
,它的默认值是允许值列表的第一个元素。
枚举
值根据它们的索引号排序,索引号取决于枚举成员在列规范中列出的顺序。例如,“b”
排序之前“一个”
为枚举(a, b)
.空字符串在非空字符串之前排序,并且零
值在所有其他枚举值之前排序。
以防止在使用时出现意外结果命令
在一个条款枚举
列,使用以下技巧之一:
指定
枚举
按字母顺序列出。确保列是按词法排序的,而不是通过编码按索引号排序的
ORDER BY演员(
或上校
字符)ORDER BY CONCAT (
.上校
)
枚举值不能是表达式,即使是计算结果为字符串值的表达式。
例如,这个创建表
声明并不工作,因为CONCAT
函数不能用于构造枚举值:
CREATE TABLE sizes (size ENUM('small', CONCAT('med','ium'), 'large'));
您也不能使用用户变量作为枚举值。这对语句可以不工作:
SET @mysize = 'medium';CREATE TABLE size (ENUM('small', @mysize, 'large'));
我们强烈建议您这样做不使用数字作为枚举值,因为它不会节省适当的存储空间非常小的整数
或短整型
类型,如果您引用枚举
值不正确。如果确实使用数字作为枚举值,请始终将其括在引号中。如果省略引号,则将该数字视为索引。看到枚举文字的处理查看如何将引用的数字错误地用作数值索引值。
定义中重复的值将导致警告,如果启用了严格的SQL模式,则会导致错误。