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

Jak*_*son 136 mysql database-design datatypes

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

此列的数据类型是 int/bool(1 或零)还是ENUM与值为enabledand一起使用更好disabled?有什么优点或缺点?

假设您有 4 个或 10 个甚至更多,而不仅仅是两个有效状态?随着所需值数量的增加,优势和劣势会向一侧倾斜还是向另一侧倾斜?

Rol*_*DBA 83

我发现了一篇关于不应该使用 ENUM 的 8 个原因的非常奇怪但内容丰富的文章

即使没有文章,我也知道

  • 添加新值没有简单的方法,有些技术风险非常高。
  • 永远不应该使用数字
  • 只使用字符串(@DTest 已经在他的回答中提到了这一点)

  • +1 您不能在其他表中重复使用 ENUM 列的成员列表。ENUM 对其他 DBMS 的可移植性有限。 (6认同)

Der*_*ney 41

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

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

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

我想说的是,随着您添加更多值,任何优势都开始从ENUM. 特别是如果您在表已被使用后添加值,因为您必须更改表结构以适应。

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

  • +1 提到唯一真正的优势:字符串表示。其他一切都是前进的洗礼。 (4认同)

Bil*_*hor 20

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

我发现它有以下缺点:

  • 没有关于代码的额外元数据的能力。
  • 难以添加或禁用值。(禁用代码可以通过触发器和到期字段来完成。)
  • 数据库中的i18n是做不到的。
  • 不能跨表重用。