10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 41.9 mb
PDF (A4)- 42.0 mb
手册页(TGZ)- 266.1 kb
手册页(邮政编码)- 376.0 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

11.3.5 ENUM类型

一个枚举是一个字符串对象,其值从创建表时在列规范中显式枚举的允许值列表中选择。

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

枚举类型有以下优点:

  • 在列的可能值集有限的情况下的紧凑数据存储。指定为输入值的字符串将自动编码为数字。看到第11.7节“数据类型存储要求”对于存储的要求枚举类型。

  • 可读查询和输出。在查询结果中,这些数字被翻译回相应的字符串。

还有这些需要考虑的潜在问题:

  • 如果使枚举值看起来像数字,则很容易将文字值与其内部索引号混淆,详见枚举限制

  • 使用枚举命令从句需要额外的小心,如在枚举排序

创建和使用ENUM列

枚举值必须是带引号的字符串字面值。例如,您可以使用枚举列如下:

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

等功能SUM ()AVG ()如果需要的话,将参数转换为数字。为枚举值,在计算中使用索引号。

枚举文字的处理

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

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

如果你将一个数字存储在枚举列中,数字被视为可能值的索引,存储的值是具有该索引的枚举成员。(然而,这一起工作加载数据,它将所有输入都视为字符串。)如果数值加了引号,如果枚举值列表中没有匹配的字符串,则它仍然被解释为索引。由于这些原因,不建议定义枚举列的枚举值看起来像数字,因为这很容易使人混淆。例如,以下列的枚举成员的字符串值为' 0 '' 1 ',' 2 '的数值索引值12,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模式,则会导致错误。