MySQL枚举与集合

tfo*_*ont 74 mysql database

对于MySQL数据类型"枚举"和"设置"使用一个与另一个的区别和优缺点是什么?

示例数据类型:

  • 枚举('A','B','C')
  • 设置('A','B','C')

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

Bra*_*ent 144

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

  • 干净且易于理解! (7认同)
  • 这应该标记为答案. (4认同)

use*_*117 64

正如MySQL文档所述:

ENUM或SET列的定义确实作为对输入到列中的值的约束.对于不满足以下条件的值,会发生错误:

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

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

  • 注意!值"(a,b,c,d)"不会被拒绝.只是`d`将被拒绝,从而产生值`(a,b,c)`. (18认同)
  • 这不是一个好的答案.要求对差异和不利/利益作出明确解释; 官方文档,这个答案只是一个副本,但没有这样做. (6认同)
  • 这可能是官方文档,但它仍然是描述它们的一种非常混乱的方式.根据其他答案,差异变得清晰.SET是一个ENUM数组,其中每个值由0或更多枚举样式值组成. (3认同)
  • (a, b, c, d) 如果开启了严格模式将被拒绝 (2认同)
  • 这不是答案。 (2认同)

Abh*_*ngh 40

枚举和设置完全取决于要求,如果你有一个单选按钮列表,一次只能选择一个,使用枚举.如果您有一个复选框列表,那么一次可以选择多个项目,请使用set.


Win*_*bob 20

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');
Run Code Online (Sandbox Code Playgroud)

你可以复制上面的代码并将其粘贴到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');
Run Code Online (Sandbox Code Playgroud)

您也可以复制上面的代码.而且你会发现每个ENUM实际上每次只能存储一次.你会发现最后两行的结果都是空的.


Har*_* H. 9

其实很简单:

当您定义ENUM('Yes', 'No', 'Maybe') 时,必须仅插入这些值之一(或它们的位置索引号)

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

希望这能解决问题。

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