MySQL枚举vs.设置


88

对于MySQL数据类型的“枚举”和“集合”,使用一种相对于另一种的优缺点是什么?

数据类型示例:

  • 枚举('A','B','C')
  • set('A','B','C')

我知道的唯一区别是ENUM仅允许选择一个值,而SET仅允许选择多个值。


5
没有副词/副词。您应根据自己的要求选择其中之一。
ravnur

1
两种类型无关。您不妨问一下哪个更好-int还是text?
波希米亚

Answers:


66

MySQL文档所述:

ENUM或SET列的定义确实限制了输入到该列中的值。不满足以下条件的值会发生错误:

一个ENUM值必须是列定义中列出的值之一,或其内部等效数字。该值不能是错误值(即0或空字符串)。对于定义为ENUM('a','b','c')的列,诸如'','d'或'ax'的值是非法的,将被拒绝。

SET值必须是空字符串或仅由列定义中列出的值组成的值,并用逗号分隔。对于定义为SET('a','b','c')的列,诸如'd'或'a,b,c,d'的值是非法的并且被拒绝。


22
注意!值(a, b, c, d)将不会被拒绝。只是d将被拒绝,从而导致价值(a, b, c)
Itay Grudev

3
这可能是官方文档,但它仍然是描述它们的非常混乱的方式。根据其他答案,差异变得很明显。SET是ENUM的数组,其中每个值都包含0个或多个枚举样式值。
Jonathon

9
这不是一个好答案。要求对差异和优缺点做出明确的解释;官方文档(仅提供此答案的副本)没有这样做。
Smuuf

如果严格模式是在(A,B,C,d)将被拒绝
Chinmay

2
这不是答案。
阿米特·

197

类比:
ENUM =单选字段(仅列出可接受的值,只能选择一个)
SET =复选框字段(仅列出可接受的值,可以选择多个)


5
干净易懂!
阿布·肖布

这是正确的区别,已清楚描述。谢谢@Brad Kent
Ravi Teja

44

枚举和设置完全取决于要求,例如,如果您有一个单选按钮列表,一次只能选择一个,则使用枚举。如果您有一个复选框列表,一次可以选择一个以上的复选框,请使用set。


22
CREATE TABLE setTest(
  attrib SET('bold','italic','underline')
);

INSERT INTO setTest (attrib) VALUES ('bold');
INSERT INTO setTest (attrib) VALUES ('bold,italic');
INSERT INTO setTest (attrib) VALUES ('bold,italic,underline');

您可以复制上面的代码并将其粘贴到mysql中,然后您会发现SET实际上是一个集合。您可以存储声明的每个属性组合。

CREATE TABLE enumTest(
 color ENUM('red','green','blue')
);

INSERT INTO enumTest (color) VALUES ('red');
INSERT INTO enumTest (color) VALUES ('gray');
INSERT INTO enumTest (color) VALUES ('red,green');

您也可以复制上面的代码。您会发现每个ENUM实际上每次只能存储一次。您会发现最后两行的结果均为空。


9

其实很简单:

当你定义一个ENUM(“是”,“否”,“也许”) ,那么你必须只插入这些值中的一个(或它们的位置索引号)

定义SET('R','W','X')时可以插入空字符串这些值中的一个或多个。如果您插入的不是预定义集中的内容,则会插入一个空字符串。请注意,在插入之前,所有重复值都将被丢弃,因此,每个允许值仅插入一个实例。

希望这可以解决。

请注意,Winbobob的答案是错误的,并且包含有缺陷的示例,因为在插入多个值时,这些值必须是字符串,并用逗号分隔。他所有的插入实际上只插入一个值(最后两个不在定义的集合中)

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.