Enumeración de MySQL frente a conjunto

88

Para el tipo de datos MySQL de "enum" y "set", ¿cuáles son las diferencias, ventajas y desventajas de usar uno frente al otro?

Tipo de datos de ejemplo:

  • enum ('A', 'B', 'C')
  • conjunto ('A', 'B', 'C')

La única diferencia que conozco es que ENUM solo permite seleccionar un valor, mientras que SET permite seleccionar varios valores.

tfont
fuente
5
No adv / desadv. Debe elegir uno de ellos en función de sus necesidades.
ravnur
1
Los dos tipos no están relacionados. También podría preguntar cuál es mejor: ¿int o text?
Bohemio

Respuestas:

66

Como dice la documentación de MySQL :

La definición de una columna ENUM o SET actúa como una restricción sobre los valores ingresados ​​en la columna. Se produce un error para los valores que no cumplen estas condiciones:

Un valor ENUM debe ser uno de los enumerados en la definición de columna, o su equivalente numérico interno. El valor no puede ser el valor del error (es decir, 0 o la cadena vacía). Para una columna definida como ENUM ('a', 'b', 'c'), valores como '', 'd' o 'ax' son ilegales y se rechazan.

Un valor SET debe ser una cadena vacía o un valor que consta solo de los valores enumerados en la definición de columna separados por comas. Para una columna definida como SET ('a', 'b', 'c'), valores como 'd' o 'a, b, c, d' son ilegales y se rechazan.

usuario2001117
fuente
22
¡NOTA! (a, b, c, d)No se rechazará un valor de . Solo dse rechazará, lo que dará como resultado el valor (a, b, c).
Itay Grudev
3
Esta podría ser la documentación oficial, pero sigue siendo una forma muy confusa de describirlos. Según otras respuestas, la diferencia se vuelve clara. SET es una matriz de ENUM, donde cada valor consta de 0 o más valores de estilo de enumeración.
Jonathon
9
Ésta no es una buena respuesta. Se pidió una explicación clara de las diferencias y desventajas / ventajas; la documentación oficial, de la cual esta respuesta es una mera copia, falla al hacerlo.
Smuuf
(a, b, c, d) será rechazado si el modo estricto está
activado
2
Ésta no es la respuesta.
Amit Shah
197

analogía:
ENUM = campos de radio (solo los valores aceptados son los enumerados, solo puede elegir uno)
SET = campos de casilla de verificación (solo los valores aceptados son los enumerados, puede elegir varios)

Brad Kent
fuente
5
¡Limpio y fácil de entender!
Abu Shoeb
Esta es la diferencia correcta que se describe claramente. Gracias @Brad Kent
Ravi Teja
44

Enum y Set dependen totalmente de los requisitos, como si tiene una lista de botones de opción donde solo se puede elegir uno a la vez, use Enum. Y si tiene una lista de casillas de verificación donde a la vez se puede elegir más de un elemento, use set.

Abhishek Singh
fuente
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');

Puede copiar el código anterior y pegarlo en mysql, y encontrará que SET en realidad es una colección. Puede almacenar cada combinación de atributos que declare.

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');

También puede copiar el código anterior. Y encontrará que cada ENUM en realidad solo se puede almacenar una vez cada vez. Y encontrará que los resultados de las últimas 2 líneas estarán vacíos.

Winbobob
fuente
9

De hecho, es bastante simple:

Cuando define un ENUM ('Sí', 'No', 'Quizás') , debe INSERTAR solo uno de estos valores (o su número de índice posicional)

Cuando define un SET ('R', 'W', 'X'), entonces puede INSERTAR una cadena vacía, o uno o más de estos valores. Si inserta algo que no está en el conjunto predefinido, se inserta una cadena vacía en su lugar. Tenga en cuenta que antes de insertar todos los valores duplicados se descartan, por lo que solo se inserta una instancia de cada valor permitido.

Espero que esto lo aclare.

Tenga en cuenta que la respuesta de Winbobob es incorrecta y contiene ejemplos defectuosos, ya que al insertar varios valores, los valores deben ser cadenas, separados por comas. Todas sus inserciones en realidad están insertando un solo valor (y los dos últimos no están en el conjunto definido)

Harly H.
fuente