• MySQL的enum类型的踩坑记录


    问题场景:

    在导出商品规格明细资料的时候,想把已经下架的商品过滤掉导出,次次导出为空,SQL语句怎么看也没有问题,表里也有数据。


    问题描述

    先看一下sql脚本和错误查询结果如下:
    MySQL的enum类型的踩坑记录


    原因分析:

    先看一下MYSQL中 ENUM 类型的详细解释

    ENUM 类型
    ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举。

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

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

    每个枚举值均有一个索引值:

    • 在列说明中列表值所允许的成员值被从 1 开始编号。
    • 空字符串错误值的索引值为 0。这就意味着,你可以使用下面所示的 SELECT 语句找出被赋于无效 ENUM 值的记录行。

    SELECT * FROM table_name WHERE enum_column = 0;

    • NULL 值的索引值为 NULL。
      表数据已经查过确实有数据,这里不多少,来看一下表结构如下:
      MySQL的enum类型的踩坑记录

    解决方案:

    于是方案来了。
    第一种,把status字段判断值改成了 ‘1’,查询结果如下:
    MySQL的enum类型的踩坑记录
    第二种,把status字段的判断值改成索引值 2,查询结果如下:
    MySQL的enum类型的踩坑记录
    所以,使用 MySQL的 ENUM 作为列的数据类型有他好的地方,也有他不好的地方,大家可以自己去研究一下,这样可以用的更得当。

  • 相关阅读:
    硬件及接口学习总结
    如何计算win/tai/loss in paired t-test
    jmeter集成kafka测试
    python之kafak应用demo
    关于LWIP的一点记录(三)
    Java项目:SSM图书销售进销存管理系统
    安卓的分区一点有用知识:super、lpunpack、lpdump
    计算机毕业设计ssm校园疫情防控系统jt87q系统+程序+源码+lw+远程部署
    RCNN系列1:RCNN介绍
    kaggle机器学习baselines
  • 原文地址:https://blog.csdn.net/jinweilin/article/details/126184701