2009-12-08 150 views
11

我试图创建一个简单的'是'/'可能'/'没有'枚举在MySQL中与PhpMyAdmin 我设置NULL为否,作为默认值MySQL Enum的始终包含''(空字符串)的可能性

我期待执行类似“SET EnumCol =''”时出错,因为''(空字符串)不应该是有效值。 但是查询得到执行并且值被设置为'' - 这意味着每当我从数据库读取数据时,我都会强制检查这个不需要的和非法的值!

这是MySQL或PhpMyAdmin中的错误吗? 有谁知道禁用此行为的方法?

谢谢。

回答

19

空字符串为ENUM中的无效值的错误指示符。从MySQL ENUM type manual

如果将一个无效值插入ENUM(也就是说,在允许值的列表中不存在的字符串),空字符串被插入,而不是作为一个特殊的错误值。该字符串可以与“普通”空字符串区分开来,因为该字符串的数值为0.更多信息,请参阅后面的内容。

要禁用此行为:

如果启用严格的SQL模式,试图插入无效枚举值导致错误。

要启用严格模式,请参阅Server SQL Modes

-2

ENUM的屁股很痛苦。除非你还需要用数字来设置值,否则我会远离它们。而是使用带查找表的外键的varchar列来限制值。这将导致无法插入一个不好的值。

+0

但'ENUM'类型的操作会比外键检查更快。 – 2009-12-08 17:34:42

+3

是真的。但谁在乎?这可能不是一个每分钟有10K插入的应用程序,切换到枚举将提高性能。选择枚举速度超过外键是一种过早优化的情况。 – longneck 2009-12-08 18:37:05

+0

我欣赏这种使用FK查找表的替代解决方案。它看起来也更具可扩展性。 – 2016-11-29 02:37:20