MySQL ENUM数据类型

2024年10月21日 MySQL ENUM数据类型 极客笔记

MySQL ENUM数据类型

MySQL中的ENUM数据类型是一个 字符串对象 。它允许我们在表创建时通过列规范限制从允许的值列表中选择的值。它是 枚举 的缩写,意味着每个列可以具有指定的可能值之一。它使用 数值索引 (1、2、3…)来表示字符串值。

MySQL ENUM数据类型具有以下优势:

  • 列可能具有有限的指定可能值时,紧凑的数据存储。在这里,字符串值自动用作数值索引。
  • 它允许可读的查询和输出,因为数字可以再次转换为相应的字符串。
  • 它可以接受许多数据类型,如整数、浮点、十进制和字符串。

语法

以下是在列中定义ENUM数据类型的语法:

CREATE TABLE table_name (
    Column1,
    Column2 ENUM ('value_1','value_2','value_3'),
    Column3…
);

在上面的语法中,我们只定义了三个ENUM值,但可以根据我们的需求增加。在这里,我们必须确保枚举值始终保持在引号括起来的字符串中。 引用字符串字面值

MySQL允许我们使用以下属性定义ENUM数据类型:

NOT NULL: 默认情况下,ENUM数据类型为空值。如果我们不想允许空值,需要在指定ENUM列时使用NOT NULL属性。

NULL: 它是DEFAULT NULL的同义词,其索引值始终为NULL。

DEFAULT: 当列中没有指定值时,ENUM数据类型插入默认值。换句话说,如果INSERT语句没有为此列提供值,则将插入默认值。DEFAULT表达式不允许插入函数。MySQL中的ENUM数据类型包括NULL或空字符串(”)作为默认值。

MySQL ENUM示例

让我们通过以下示例来了解MySQL中ENUM数据类型的工作原理。在这里,我们将创建一个名为” shirts “的表,该表包含三列:id、name和size。

size列使用ENUM数据类型,并具有small、medium、large和x-large四个尺寸。MySQL将这些枚举成员映射到数字索引,其中small=1,medium=2,large=3和x-large=4。执行以下查询创建表:

CREATE TABLE shirts (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    name VARCHAR(35), 
    size ENUM('small', 'medium', 'large', 'x-large')
);

接下来,我们需要 插入 值到表中。在插入时,枚举值可以用字符串字面值或其数字索引插入,两者是相同的。执行下面的语句将值插入表中:

INSERT INTO shirts(id, name, size) 
VALUES (1,'t-shirt', 'medium'), 
(2, 'casual-shirt', 3), 
(3, 'formal-shirt', 4), 
(4, 'polo-shirt', 'small');

现在,执行 SELECT语句 以查看插入到表中的值:

mysql> SELECT * FROM shirts;

以下图像包含了上述查询结果,其中只包含了字符串文字的枚举值:

枚举排序

MySQL根据其数值索引对枚举值进行排序,该数值索引取决于我们在列规范中插入数据的顺序。 例如 ,如果我们将枚举定义为ENUM(’b’,’a’,”,’c’)。那么,b在a之前,空字符串在c(非空字符串)之前,NULL值在其他值之前。

因此,如果我们不想在使用ENUM数据类型时得到意外结果,请按照以下规则使用ORDER BY子句:

  • 按字母顺序定义枚举值。
  • 确保列名按字典顺序而不是索引编号排列。

下面的示例更清楚地解释了枚举排序。所以,如果你想以特定顺序获取衬衫的尺寸,请执行以下语句:

mysql> SELECT * FROM shirts ORDER BY  size DESC;

此查询将按照以下方式输出,我们可以看到衬衫的尺寸是按降序排列的:

ENUM数据类型的限制

MySQL中ENUM数据类型有以下缺点:

1. 如果我们想要修改枚举值/成员,需要使用ALTER TABLE命令来重新构建整个表。这会消耗大量资源和时间。

2. 我们不能在枚举成员中使用表达式。例如,这个CREATE语句无法执行,因为它使用CONCAT()函数来创建枚举成员。

CREATE TABLE shirts (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    name VARCHAR(35), 
    size ENUM('small', CONCAT('med','ium'), 'large', 'x-large')
);

3.我们不能将用户变量用作枚举成员。可以在下面的示例中看到:

SET @mysize = 'large';

CREATE TABLE shirts (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    name VARCHAR(35), 
    size ENUM('small', 'medium', @mysize, 'x-large')
);

4. 建议不要使用数字值作为枚举成员。

5. 获取完整的信息枚举列表是复杂的,因为我们需要访问information_schema数据库。

6. 在将ENUM移植到其他RDBMS时可能会遇到问题,因为许多数据库不支持此数据类型。

7. 我们无法向枚举列表添加更多属性。

本文链接:http://so.lmcjl.com/news/15924/

展开阅读全文