mysql中的ENUM类型

ENUM 是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。

在某些情况下,ENUM 值也可以为空字符串( '' ) 或NULL :

·         如果你将一个非法值插入ENUM ( 也就是说,允许的值列之外的字符串) ,将插入空字符串以作为特殊错误值。该字符串与“普通”空字符串不同,该字符串有数值值0 。后面有详细讨论。

·         如果将ENUM 列声明为允许NULL ,NULL 值则为该列的一个有效值,并且 默认值为NULL 。如果ENUM 列被声明为NOT NULL ,其默认值为允许的值列的第1 个元素。

每个枚举值有一个索引:

·         来自列规定的允许的值列中的值从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

枚举最多可以有65,535 个元素。

当创建表时,ENUM 成员值的尾部空格将自动被删除。

当检索时,保存在ENUM 列的值使用列定义中所使用的大小写来显示。请注意可以为ENUM 列分配字符集和 校对规则。对于二进制或大小写敏感的校对规则,当为列分配值时应考虑大小写。

如果在数值上下文中检索一个ENUM 值,将返回列值的索引。例如,你可以这样从ENUM 列搜索数值值:

mysql> 
SELECT enum_col+0 FROM tbl_name;

如果将一个数字保存到ENUM 列,数字被视为索引,并且保存的值是该索引对应的枚举成员。( 但是,这不适合LOAD DATA ,它将所有输入视为字符串)。 不建议使用类似数字的枚举值来定义一个ENUM 列,因为这很容易引起混淆。例如,下面的列含有字符串值'0' 、'1' 和'2' 的枚举成员,但数值索引值为1 、2 和3 :

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

根据枚举成员在列定义中列出的顺序对ENUM 值进行排序。( 换句话说,ENUM 值根据索引编号进行排序)。 例如,对于ENUM('a' ,'b') ,'a' 排在'b' 前面,但对于ENUM('b' ,'a') ,'b' 排在'a' 前面。空字符串排在非空字符串前面,并且NULL 值排在所有其它枚举值前面。要想防止意想不到的结果,按字母顺序规定ENUM 列。还可以使用GROUP BY  CAST(col AS CHAR) 或GROUP BY  CONCAT(col) 来确保按照词汇对列进行排序而不是用索引数字。

如果你想要确定一个ENUM 列的所有可能的值,使用SHOW COLUMNS FROM tbl_name LIKE enum_col ,并解析输出中第2 列的ENUM 定义。

### MySQLENUM 数据类型的定义、用法特性 #### 1. 定义 ENUM 是一种特殊的字符串对象,其必须是预定义集合中的一个。它在创建表时通过指定可能的来定义,字段的只能是枚举列表中的一个[^4]。这种数据类型非常适合存储有限选项的场景,例如星期('Monday', 'Tuesday', 'Wednesday' 等)或状态('Open', 'Closed', 'Pending' 等)。 #### 2. 使用场景 ENUM 类型适用于以下场景: - 存储具有固定选项的数据,例如性别('Male', 'Female')、状态('Active', 'Inactive')等。 - 需要确保字段的完整性一致性,避免输入无效。 - 在存储空间询效率方面具有一定优势的场景[^2]。 #### 3. 特性 - **存储效率**:MySQL 内部将 ENUM 存储为整数索引,从而节省存储空间。如果枚举列表包含少于或等于 255 个元素,则使用 1 字节存储;否则使用 2 字节存储[^5]。 - **排序与比较**:ENUM 按照定义时的顺序进行排序比较,而不是基于字符串的字典顺序[^4]。 - **默认处理**:如果插入的不在枚举列表中,MySQL 将其视为错误,并根据 SQL 模式决定是否插入空字符串或生成警告信息[^5]。 - **索引支持**:ENUM 字段可以被索引,以加速询操作[^4]。 #### 4. 示例代码 以下是一个使用 ENUM 数据类型的示例: ```sql CREATE TABLE employees ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), status ENUM('Active', 'Inactive', 'Terminated') NOT NULL ); ``` 在上述代码中,`status` 字段使用了 ENUM 类型,允许的为 'Active', 'Inactive' 'Terminated'。 插入数据时,只能使用预定义的枚举之一: ```sql INSERT INTO employees (name, status) VALUES ('John Doe', 'Active'); INSERT INTO employees (name, status) VALUES ('Jane Smith', 'Inactive'); ``` 尝试插入无效会导致错误: ```sql INSERT INTO employees (name, status) VALUES ('Alice Johnson', 'Unknown'); -- 错误 ``` #### 5. 注意事项 - 如果需要更改 ENUM 列的列表,必须使用 `ALTER TABLE` 语句,这可能会导致表锁定性能问题。 - ENUM是区分大小写的,因此在定义插入时需注意大小写的一致性[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值