2024年10月21日 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数据类型的工作原理。在这里,我们将创建一个名为” 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;
此查询将按照以下方式输出,我们可以看到衬衫的尺寸是按降序排列的:
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/