MYSQL中 ENUM 类型的 查询坑点

CREATE TABLE `address` (
  `is_default` enum('0','1') NOT NULL DEFAULT '0' COMMENT '1默认收货地址',
) ENGINE=InnoDB AUTO_INCREMENT=8196 DEFAULT CHARSET=utf8 COMMENT='买家地址信息表';

 

查询条件是enum类型的字段时,如果是想比较emun值就要传字符串,enum类型每个枚举的值都会有个隐形的索引,如果比较的值是整型将会引用enum索引对应的值,enum的索引以1开始,enum可以类比成PHP这样的索引数组

[
    1 => '0', 枚举值为0
    2 => '1', 枚举值为1
]

以上数据表结构为查询实例:

where is_default = 1 //实际上在查询时会转换为where is_default = '0'
where is_default = 2 //实际上在查询时会转换为where is_default = '1'
where is_default = '0' //实际上在查询时会转换为where is_default = '0'
where is_default = '1' //实际上在查询时会转换为where is_default = '1'

 

听说enum字段插入值为整数时荟报错,有待查证https://blog.youkuaiyun.com/u012643122/article/details/52643686

参考资料:https://www.cnblogs.com/skillCoding/archive/2012/03/14/2395404.html

 

### 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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值