MYSQL中 ENUM 类型的详细解释

本文深入探讨了MySQL ENUM类型的特性,包括其值的定义、空字符串与NULL值的特殊处理、索引值的分配以及如何在SQL查询中利用这些特性。了解ENUM类型有助于在数据库设计中更有效地组织和管理数据。
ENUM 类型
ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举。

在下列某些情况下,值也可以是空串("") 或 NULL:

如果将一个无效值插入一个 ENUM (即,一个不在允许值列表中的字符串),空字符串将作为一个特殊的错误值被插入。事实上,这个字符串有别于一个"普通的"空字符串,因为这个字符串有个数字索引值为 0。稍后有更详细描述。
如果一个 ENUM 被声明为 NULL,NULL 也是该列的一个合法值,并且该列的缺省值也将为 NULL 。如果一个 ENUM 被声明为 NOT NULL,该列的缺省值将是该列表所允许值的第一个成员。
每个枚举值均有一个索引值:

在列说明中列表值所允许的成员值被从 1 开始编号。
空字符串错误值的索引值为 0。这就意味着,你可以使用下面所示的 SELECT 语句找出被赋于无效 ENUM 值的记录行。
mysql> SELECT * FROM tbl_name WHERE enum_col=0;
NULL 值的索引值为 NULL。
例如,指定为 ENUM("one", "two", "three") 的一个列,可以有下面所显示的任一值。每个值的索引值也如下所示:

值 索引值
NULL NULL
"" 0
"one" 1
"two" 2
"three" 3

换个枚举最大可以有 65535 个成员值。

从 MySQL 3.23.51 开始,当表被创建时,ENUM 值尾部的空格将会自动删除。

当为一个 ENUM 列赋值时,字母的大小写是无关紧要的。然而,以后从列中检索出来的值的大小写却是匹配于创建表时所指定的允许值。

如果在一个数字语境中检索一个ENUM,列值的索引值将被返回。例如,你可以像这样使用数字值检索一个 ENUM 列:

mysql> SELECT enum_col+0 FROM tbl_name;
如果将一个数字存储到一个 ENUM 中,数字被当作为一个索引值,并且存储的值是该索引值所对应的枚举成员。(但是,这在 LOAD DATA 将不能工作,因为它视所有的输入均为字符串。) 在一个 ENUM 字符串中存储数字是不明智的,因为它可能会打乱思维。

ENUM 值依照列规格说明中的列表顺序进行排序。(换句话说,ENUM 值依照它们的索引号排序。)举例来说,对于 ENUM("a", "b") "a" 排在 "b" 后,但是对于 ENUM("b", "a") , "b" 却排在 "a" 之前。空字符串排在非空字符串前,NULL 值排在其它所有的枚举值前。为了防止意想不到的结果,建议依照字母的顺序定义 ENUM 列表。也可以通过使用 GROUP BY CONCAT(col) 来确定该以字母顺序排序而不是以索引值。

如果希望得到一个 ENUM 列的所有可能值,可以使用 SHOW COLUMNS FROM table_name LIKE enum_colum
<think>我们正在讨论MySQL中的ENUM类型ENUM是一个字符串对象,其值从创建表时指定的允许值列表中选择。 主要特点: 1. 定义方式:ENUM('value1','value2',...,'valuen'),例如ENUM('Y','N')表示只能取这两个值之一。 2. 存储方式:MySQL在存储ENUM时,实际上存储的是值的索引(1,2,3,...)而不是字符串本身,这使得存储空间更小。 3. 索引值:索引从1开始,空字符串错误值(如果允许)的索引为0。注意:NULL值的索引为NULL。 优点: - 节省存储空间:相比于存储完整的字符串,ENUM只需要1或2个字节(最多65535个元素)。 - 确保数据完整性:只能插入预定义的值。 缺点: - 修改枚举值需要ALTER TABLE,这可能是一个昂贵的操作,尤其是在大表上。 - 枚举值列表是固定的,添加或删除值需要修改表结构。 - 在代码中处理枚举值时,可能需要额外的映射(因为存储的是索引,但查询时显示的是字符串)。 使用场景:适合固定且有限的值,比如状态标志(如'active','inactive')、性别('male','female')等。 与TINYINT(1)的比较: - ENUM在存储上可能更节省(例如,只有两个值时,ENUM只需1个字节,而TINYINT也是1个字节,但TINYINT存储的是0/1,而ENUM存储的是1/2)。 - 可读性:ENUM在查询时直接显示字符串值,而TINYINT需要应用层解释0/1的含义。 - 扩展性:如果需要增加状态,ENUM需要修改表结构,而TINYINT只需在应用层扩展(但需要确保数据库中的值在应用层有对应)。 因此,在值固定且数量少(比如几个)的情况下,ENUM是一个不错的选择。如果值可能频繁变化,或者需要更多的状态(超过几十个),则考虑使用TINYINT或VARCHAR。 例如,在之前提到的表中,`if_mag`字段定义为ENUM('Y','N'),非常适合。 现在,按照要求,在回答后提出3-5个相关问题。 </think>### MySQL中的ENUM类型详解 在MySQL中,`ENUM`是一种特殊的字符串数据类型,允许从预定义的值列表中选择一个值。其主要特性如下: 1. **定义方式** ```sql column_name ENUM('value1', 'value2', ..., 'valuen') ``` 例如:`if_mag ENUM('Y','N') DEFAULT NULL` 2. **核心特性** - **严格值约束**:只能存储定义时指定的值(如'Y'/'N'),插入其他值会报错或存为特殊错误值 - **高效存储**:实际存储的是值的索引(1字节可存255个值,2字节存65535个值) - **排序规则**:按定义顺序排序(非字母顺序),`ORDER BY`会按索引值排序 - **空值处理**: - 允许`NULL`(需显式声明`DEFAULT NULL`) - 非法值存储为`''`(空字符串) 3. **与TINYINT(1)对比** | 特性 | ENUM | TINYINT(1) | |---|---|--| | 可读性 | 直接显示'Y'/'N' | 显示0/1 | | 存储空间 | 1-2字节 | 1字节 | | 值约束 | 严格 | 无约束 | | 扩展性 | 修改需ALTER TABLE | 无需修改表结构 | 4. **使用场景** - 固定选项字段(如状态标志、类型分类) - 需要强制数据完整性的场景 - 对存储空间敏感的高频查询字段 5. **注意事项** ```sql -- 错误示例:插入未定义值 INSERT INTO table (if_mag) VALUES ('X'); -- 将存储为'' -- 正确使用索引值 SELECT * FROM table WHERE if_mag = 1; -- 等同于 WHERE if_mag='Y' ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值