使用ENUM和Integer类型的优缺点?


110

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

将此列的数据类型设置为int / bool(1或零)还是ENUM将值enabled与and 一起使用会更好disabled吗?优点或缺点是什么?

假设您有4个,10个甚至更多个,而不仅仅是两个有效的状态?随着所需值数量的增加,优势和劣势会左右摇摆吗?


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

Answers:


70

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

即使没有文章,我也知道


1
尽管该主题中的其他答案非常有用,但由于这篇文章非常有帮助,因此我将其标记为答案。
杰克·威尔逊

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

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

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

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

39

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

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

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

我想说的是,当您添加更多值时,任何优势都将逐渐消失ENUM。特别是如果在表已经使用之后添加值,因为必须更改表结构以适应。

使用的优点是ENUM什么?该值含义的字符串表示形式。就我而言,就是这样。它的价值取决于您的应用程序。


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

19

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

我发现它具有以下缺点:

  • 无法提供有关代码的其他元数据。
  • 难以添加或禁用值。(禁用代码可以通过触发器和到期字段来完成。)
  • 在数据库中无法完成I18n。
  • 不可跨表重复使用。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.