# 11.3.5 枚举类型

一个枚举是一个字符串对象,其值选自创建表时列规范中明确枚举的允许值列表。

第 11.3.1 节,“字符串数据类型语法”为了枚举类型语法和长度限制。

枚举类型具有以下优点:

# 创建和使用枚举列

枚举值必须是带引号的字符串文字。例如,可以使用枚举像这样的专栏:

CREATE TABLE shirts (
    name VARCHAR(40),
    size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);
INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),
  ('polo shirt','small');
SELECT name, size FROM shirts WHERE size = 'medium';
+---------+--------+
| name    | size   |
+---------+--------+
| t-shirt | medium |
+---------+--------+
UPDATE shirts SET size = 'small' WHERE size = 'large';
COMMIT;

在该表中插入100万行,值为“中等”将需要100万字节的存储空间,而如果存储实际字符串,则需要600万字节的存储空间“中等”在一个瓦尔查尔

# 枚举文字的索引值

每个枚举值都有一个索引:

  • 列规范中列出的元素被分配了索引号,从1开始。

  • 空字符串错误值的索引值为0。这意味着您可以使用以下选择语句来查找无效的枚举分配的值为:

    mysql> SELECT * FROM tbl_name WHERE enum_col=0;
    
  • 指数无效的价值是无效的.

  • 这里的术语“索引”指的是枚举值列表中的一个位置。它与表索引无关。

    例如,指定为枚举(“水星”、“金星”、“地球”)可以具有此处显示的任何值。还显示了每个值的索引。

价值 指数
无效的 无效的
'' 0
“水星” 1.
“维纳斯” 2.
“地球” 3.

枚举列最多可以有65535个不同的元素。

如果你找到一个枚举值在数值上下文中,返回列值的索引。例如,可以从数据库中检索数值枚举像这样的专栏:

mysql> SELECT enum_col+0 FROM tbl_name;

功能,例如SUM()平均值()如果需要的话,可以将参数转换为数字。对于枚举值,则在计算中使用索引号。

# 枚举文本的处理

尾随空格将自动从中删除枚举创建表时,表定义中的成员值。

检索时,将值存储到枚举列使用列定义中使用的大写字母显示。注意枚举可以为列指定字符集和排序规则。对于二进制或区分大小写的排序规则,在为列赋值时会考虑字母大小写。

如果你把一个数字存储到枚举列中,该数字被视为可能值的索引,存储的值是具有该索引的枚举成员。(然而,这是事实。)合作加载数据,将所有输入视为字符串。)如果数值被引用,如果枚举值列表中没有匹配的字符串,它仍然被解释为索引。由于这些原因,不建议定义枚举列的枚举值看起来像数字,因为这很容易让人困惑。例如,以下列包含字符串值为的枚举成员'0', '1''2',但1., 2.3.:

numbers ENUM('0','1','2')

如果你去商店2.,它被解释为索引值,并成为'1'(索引为2的值)。如果你去商店'2',它与枚举值匹配,因此存储为'2'.如果你去商店'3',它与任何枚举值都不匹配,因此它被视为索引并成为'2'(索引为3的值)。

mysql> INSERT INTO t (numbers) VALUES(2),('2'),('3');
mysql> SELECT * FROM t;
+---------+
| numbers |
+---------+
| 1       |
| 2       |
| 2       |
+---------+

确定枚举列,使用显示来自*tbl_名称*就像*enum_col*'然后分析枚举中的定义类型输出的列。

在C API中,枚举值作为字符串返回。有关使用结果集元数据将其与其他字符串区分开来的信息,请参阅C API基本数据结构 (opens new window).

# 枚举值为空或空

枚举值也可以是空字符串('')或者无效的在某些情况下:

  • 如果将无效值插入枚举(即,允许值列表中不存在的字符串),空字符串将作为特殊错误值插入。此字符串与“普通”空字符串的区别在于,此字符串的数值为0。看见枚举文字的索引值有关枚举值的数字索引的详细信息。

    如果启用了严格SQL模式,则尝试插入无效枚举值会导致错误。

  • 如果枚举列被声明为允许无效的这个无效的值是该列的有效值,默认值为无效的.如果枚举列已声明非空,其默认值是允许值列表的第一个元素。

# 枚举排序

枚举值根据其索引编号进行排序,索引编号取决于枚举成员在列规范中列出的顺序。例如“b”排序之前“a”对于枚举('b','a')。空字符串在非空字符串之前排序,并且无效的值排序在所有其他枚举值之前。

以防止在使用订购人关于枚举列中,使用以下技术之一:

  • 指定枚举按字母顺序列出。

  • 确保该列按词汇排序,而不是按编码的索引号排序按演员顺序(*上校*作为字符)康卡特订购(*上校*).

# 枚举限制

枚举值不能是表达式,甚至不能是计算结果为字符串值的表达式。

比如这个创建表格声明确实如此工作是因为海螺函数不能用于构造枚举值:

CREATE TABLE sizes (
    size ENUM('small', CONCAT('med','ium'), 'large')
);

也不能将用户变量用作枚举值。这两条语句工作:

SET @mysize = 'medium';

CREATE TABLE sizes (
    size ENUM('small', @mysize, 'large')
);

我们强烈建议您这样做使用数字作为枚举值,因为它不会通过适当的TINYINT斯莫林输入,如果您引用枚举值不正确。如果确实使用数字作为枚举值,请始终用引号将其括起来。如果省略引号,则该数字被视为索引。看见枚举文本的处理看看连带引号的数字都会被错误地用作数字索引值。

如果启用了严格SQL模式,定义中的重复值将导致警告或错误。