• 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 作为列的数据类型有他好的地方,也有他不好的地方,大家可以自己去研究一下,这样可以用的更得当。

  • 相关阅读:
    差分约束学习笔记
    页面中使用iframe
    java毕业设计奶茶店管理系统(附源码、数据库)
    QT QToolBox控件使用详解
    redis设计与实现 笔记(一)
    基于Flask框架实现Mock Server
    leetcode做题笔记200. 岛屿数量
    Java学习之SPI、JDBC、SpringFactoriesLoader、Dubbo
    跨境电商运营的新趋势:自养号测评补单技术解析
    任务九 深度学习 K近邻学习
  • 原文地址:https://blog.csdn.net/jinweilin/article/details/126184701