使用枚举('y','n')而不是MySQL表中的布尔字段是不是很糟糕?

时间:2012-06-04 13:48:48

标签: mysql

几年前,我看到了由第三方开发的系统的DB模式,并注意到他们使用枚举('y','n')而不是布尔(tinyint)字段。我不知道为什么,但我非常喜欢它,我发现它让事情变得更容易阅读(我知道这完全是主观的),但我采用它并从此开始使用它。我想我可以把它换成“真”和“假”但是,我能说什么,我只是喜欢它。

现在有人说,以这种方式做事是否有任何挫折 - 除了可能会稍微讨厌那些在游戏后期进入的程序员?

3 个答案:

答案 0 :(得分:9)

是的,这很糟糕。你失去了直观的布尔逻辑(SELECT * FROM user WHERE NOT banned变为SELECT * FROM user WHERE banned = 'n'),你在应用程序端接收字符串而不是布尔值,所以你的布尔条件也变得很麻烦。其他使用您的模式的人会因为看到类似标志的列名并尝试在其上使用布尔逻辑而受到攻击。

答案 1 :(得分:1)

the manual中所述:

  

如果在ENUM中插入无效值(即允许值列表中不存在的字符串),则会插入空字符串作为特殊错误值。通过此字符串具有数字值0,可以将此字符串与“普通”空字符串区分开来。有关枚举值的数字索引的详细信息,请参阅Section 11.4.4, “ Index Values for Enumeration Literals ”

     

如果启用了严格的SQL模式,则尝试插入无效的ENUM值会导致错误。

在这方面,ENUM导致BOOLEAN类型的行为不同;否则我倾向于同意@lanzz's answer它与一个应用程序的集成有点不那么直接。

答案 2 :(得分:0)

要考虑的一个因素是编写原始模式的人是否将其限制为MySQL。如果只打算在MySQL上运行,那么适应MySQL是有道理的。如果相同的模式可以与其他DBMS一起使用,那么在所有相关DBMS中工作的更通用的模式设计对于进行设计的人来说可能更好。

话虽如此,enum具有中等的MySQL特定性,但可以在其他DBMS中轻松创建等同于enum的东西:

CREATE TABLE ...
(
    ...
    FlagColumn   CHAR(1) NOT NULL CHECK(FlagColumn IN ('y', 'n')),
    ...
);

不同的DBMS处理BOOLEAN的方式并不像你希望的那样统一,尽管SQL Standard尽管如此(原因是历史一直如此;不太符合要求的系统之前对BOOLEAN的主题有变化标准做了,改变他们的实现打破了他们现有客户的代码。)

因此,我不会自动谴责使用enum而不是boolean,但最好将boolean用于布尔标记。

相关问题