【问题标题】:MySQL enums empty valueMySQL枚举空值
【发布时间】:2011-11-17 21:29:51
【问题描述】:

我正在尝试了解如何在 mysql 中使用枚举。 如果我向枚举字段中插入不属于枚举类型的任何内容——mysql 会插入空字符串(值为 0)。

  • 水果枚举('APPLE','BANANA','PEACH');
  • 插入 ...fruit='BANNANA'

简单的拼写错误和 MySQL 插入空值、破坏数据库完整性并使枚举非常无用。

CHECK 约束在这里可能会有所帮助,但 MySQL 不支持它们(对于 2011 年“最流行”的数据库来说非常有趣)

我看到的唯一方法是编写触发器以防止空字符串,但是对于这种简单的情况编写触发器的工作量太大。

有没有办法为枚举禁用“空字符串”MySQL 行为?

谢谢

【问题讨论】:

    标签: mysql


    【解决方案1】:

    看看sql模式

    SET SQL_MODE='TRADITIONAL';
    

    【讨论】:

      【解决方案2】:

      根据documentation:

      如果您在 ENUM 中插入无效值(即,允许值列表中不存在的字符串),则会将空字符串作为特殊错误值插入。通过这个字符串的数值为 0,可以将此字符串与“正常”的空字符串区分开来。

      顺便说一句,我 (and others) 建议您避免使用枚举,因为它们效率不高。

      如果您确实需要枚举,请考虑使用严格模式。当您尝试将无效值插入 ENUM 列时,严格模式至少会引发错误。否则只会抛出一个警告,并且该值被简单地设置为一个空字符串''(内部引用为 0)。注意:如果使用 IGNORE,仍然可以在严格模式下抑制错误。

      这是documentation on setting your MySQL server mode的链接。

      编码愉快!

      更新: Nick 的回答是将服务器设置为严格模式的一种方法。 TRADITIONAL 模式等效于 STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER,因此请记住,您将对其他数据类型执行额外的数据验证,例如 DATE。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多