MySQL枚举与集合

MySQL枚举与集合,mysql,database,Mysql,Database,对于MySQL数据类型“enum”和“set”,使用两者的区别和优缺点是什么 示例数据类型: 枚举('A','B','C') 集合('A','B','C') 我所知道的唯一区别是ENUM只允许选择一个值,而SET允许选择多个值。如下所示: 枚举或集合列的定义不作为值的约束 输入该列。对于不正确的值,会发生错误 满足以下条件: 枚举值必须是列定义中列出的值之一,或 其内部数字等价物。该值不能为错误值 值(即0或空字符串)。对于定义为 枚举('a'、'b'、'c')、值(如“”、'd'或'ax'

对于MySQL数据类型“enum”和“set”,使用两者的区别和优缺点是什么

示例数据类型:

  • 枚举('A','B','C')
  • 集合('A','B','C')
我所知道的唯一区别是ENUM只允许选择一个值,而SET允许选择多个值。

如下所示:

枚举或集合列的定义不作为值的约束 输入该列。对于不正确的值,会发生错误 满足以下条件:

枚举值必须是列定义中列出的值之一,或 其内部数字等价物。该值不能为错误值 值(即0或空字符串)。对于定义为 枚举('a'、'b'、'c')、值(如“”、'd'或'ax'等)是非法的,并且是无效的 拒绝

集合值必须是空字符串或仅由 列定义中列出的值,以逗号分隔。暂时 列定义为集合('a','b','c'),值如'd'或'a,b,c,d' 是非法的,被拒绝


Enum和Set完全取决于需求,例如,如果您有一个单选按钮列表,其中一次只能选择一个,请使用Enum。如果您有一个复选框列表,其中一次可以选择多个项目,请使用set

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');
您也可以复制上面的代码。您会发现每个枚举实际上每次只能存储一次。你会发现最后两行的结果都是空的

类比:
枚举=无线电字段(仅接受列出的值,只能选择一个)

SET=checkbox字段(仅接受列出的值,可以选择多个)

实际上非常简单:

定义枚举(“是”、“否”、“可能”)时,必须只插入其中一个值(或其位置索引号)

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

希望这能把事情弄清楚

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

ENUM-->只选择一个可用值进行插入

(无空,无任何重复)


SET-->选择任意组合或单个值(如集合),然后将其插入


(空,单个值,所有可用值一起)

无adv/disadv。您应该根据自己的需求选择其中一种。这两种类型是不相关的。你可能会问哪个更好-int还是text?注意!
(A、b、c、d)
的值不会被拒绝。只有
d
将被拒绝,从而导致值
(a,b,c)
。这可能是官方文档,但描述它们的方式仍然非常混乱。根据其他答案,差异变得明显。集合是枚举数组,其中每个值由0个或多个枚举样式值组成。这不是一个好答案。要求明确解释差异和缺点/优点;该答案仅为副本的官方文件未能做到这一点。(a、b、c、d)如果使用严格模式,则将被拒绝。这不是答案。干净且易于理解!这是正确的区别,描述得很清楚。谢谢你@Brad Kent