假设在某个随机表中,您有一列名为status的列。它的实际值是启用还是禁用。

此列的数据类型是int / bool(1还是零)还是使用ENUMenableddisabled更好? ?优点或缺点是什么?

比起两个有效状态,您拥有4个或10个甚至更多个状态?随着所需值数量的增加,优点和缺点会左右摇摆吗?

评论

所有MySQL开发人员都应将此问题添加为书签,因为它可能成为令人伤心或胜利的根源。 +1 !!!

#1 楼

我发现了一篇非常奇怪但内容丰富的文章,其中介绍了为什么不应该使用ENUM的8个原因。
即使没有该文章,我也知道



有这不是添加新值的简单方法,有些技术具有很高的风险
永远不要使用数字
仅使用字符串(@DTest在其答案中已经提到过)


评论


尽管此主题中的其他答案很有帮助,但由于这篇文章非常有帮助,因此我将其标记为答案。

–杰克·威尔逊(Jake Wilson)
2011年10月19日在16:44

+1您无法在其他表中重复使用ENUM列的成员列表。 ENUM对其他DBMS的可移植性受到限制。

–有一天
2011-10-20 8:24



如果我的字段与同一表的其他记录有关系,该怎么办?例如,假设一个商店商品的单位模型,其中每个记录应具有与其相关单位组成有关的属性。即吨,千克,克

–SaidbakR
16年1月12日在12:52

那篇文章没什么奇怪的-太好了!我认为正是这篇文章使我明白了他们为什么不好!我给了它+1!

–Vérace
17-10-24在16:52

本文建议使用一个良好的旧表,而不是ENUM类型。我们应该将此添加到答案中吗?

– Utku
17年11月24日在15:51

#2 楼

好吧,首先,我们有存储需求。我要假设你的意思是tinyint(而不是int)。


ENUM占用1个字节(如果小于255个值)或2个字节(最大65,535
TinyInt占用1个字节(最多255个值)
布尔值是TinyInt的同义词

因此,从表面上看,它们都是一样的。ENUM确实占用了一些元数据不过,与之关联的字符串值(旧src)

我想说的是,尽管您添加了更多的值,但是任何优势都开始摆脱ENUM,特别是如果在表已被使用之后添加这些值,因为您必须更改表结构以适应。

使用ENUM有什么好处?就值而言,它是字符串表示形式,就我而言。有价值取决于您的应用程序。

评论


+1是唯一真正的优势:字符串表示。其他一切都将继续前进。

– RolandoMySQLDBA
2011年10月19日下午16:26

#3 楼

我发现ENUM是代码表的缩写形式。它的主要优点是它避免了加入和显示代码描述所需的代码。如果它们以字符串形式到达,也可以简化设置值。

我发现它具有以下缺点:


无法提供有关代码的其他元数据。
很难添加或禁用值。 (禁用代码可以通过触发器和到期字段完成。)
无法在数据库中完成I18n。