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.
Respuestas:
Como dice la documentación de MySQL :
fuente
(a, b, c, d)
No se rechazará un valor de . Solod
se rechazará, lo que dará como resultado el valor(a, b, c)
.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)
fuente
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.
fuente
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.
fuente
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)
fuente