Diferencias entre ENUM y SET en MySQL

MySQL AvanzadoExistes dos tipos de campo en MySQL que siempre los he visto iguales. He investigado un poco en sus diferencias y lo que voy a comentar sirve tanto para MySQL 5.1 como MySQL 5.4.

Tanto ENUM como SET, sirven para determinar los valores que puede tener un campo de una tabla, es decir, puedes determinar que en un campo solamente pueda contener valores de una lista definida por ti. La principal diferencia es que un campo del tipo ENUM siempre contiene sólo un valor de la lista; y un campo del tipo SET puede contener ninguno, uno o varios valores de la lista.

Hay más características de estos dos campos de MySQL, que les hace diferenciarse y es necesario conocerlas para decidir cual es más apropiado para nuestro diseño de la base de datos.

El tipo de campo ENUM se caracteriza por:

CREATE TABLE sizes (
	size ENUM('small', 'medium', 'large') NOT NULL DEFAULT 'medium'
);
  • Sólo contiene un valor
  • Se puede definir la lista de hasta 65535 valores distintos
  • Si se permite NULL, este será el valor por defecto; sinó, y si no se define con DEFAULT, será el primer valor de la lista (en el ejemplo de arriba, si no defino el DEFAULT ‘medium’, por defecto sería ‘small’)
  • Cada valor de la lista es numerado con un índice (empieza desde el 1), pudiendo usar el índice en vez del valor de la lista (en el ejemplo de arriba: 1=>’small’, 2=>’medium’ y 3=>’large’)
  • En caso de introducir un valor no perteciente a la lista, el campo pasará a valer ”, una cadena vacía, que tiene el índice zero
  • El índice de NULL es NULL,
  • Para retornar el índice de un campo del tipo ENUM, podemos sumar zero al campo (SELECT size+0 FROM …)
  • De almacenamiento físico, ocupará 1 byte si hay 255 o menos valores en la lista, o 2 bytes si hay 256 o más valores

El tipo de campo SET se caracteriza por:

CREATE TABLE letters (
	letter SET('a', 'b', 'c', 'd')
);
  • Contiene zero, uno o varios valores
  • Se puede definir la lista de hasta 64 valores distintos
  • Los valores no pueden contener comas, ya que los valores asignados son separados por comas
  • Cada valor de la lista representa un bit de la cadena de bits del campo
  • El valor decimal del campo determina los bits, marcando los valores que contiene el campo,de manera que si todos los bits estan a 1, es que ese campo contiene todos los valores (ejemplo: si el valor decimal es 7, en binario sería 0111, y eso quiere decir que el campo contiene los valore ‘a’, ‘b’ y ‘c’)
    SET Decimal Bytes
    ‘a’ 1 0001
    ‘b’ 2 0010
    ‘c’ 4 0100
    ‘d’ 8 1000
  • De almacenamiento físico, ocupará 1, 2, 3, 4, o 8 bytes, según la longitud de la lista de valores (si N es el número de valores, la formula es (N+7)/8 bytes)

Conociendo más a fondo los tipos de campos, y sabiendo sus posibilidades, ahora es fácil decidirse y justicarse.

18 comentarios en “Diferencias entre ENUM y SET en MySQL

  1. muy bueno pero si quisera que se restringieran los valores del set por los datos de una tabla (integridad referencial) como lo haria?

  2. Sé que llego tarde, pero para Félix: tendrías que tener una tabla con la id de referencia de la tabla de la que partes, crear una clave foránea para relacionarlas, y tirar de una subconsulta o una consulta de unión interna.

    Muy bien explicado el post, bastante más cómodo que ir a la documentación oficial :P

  3. Muchísimas gracias, me ha quedado clarito, clarito. He dado un vistazo al resto del blog y los contenidos me han parecido muy interesantes. ¡De cabeza pa el feedly!

  4. Muy buena explicación, justo me enviaron a hacer un trabajo de este tipo. Gracias por la info.

  5. Hola. ¡Muy buena explicación! Gracias. Quería consultar lo siguiente: ¿Cómo puedo conocer los valores posibles de un SET desde php para poner las opciones en un SELECT?
    Saludos.

  6. Tengo una duda como defino el tipo de dato para un select option (combobox de paises)

  7. Jajajaja no sé como agradecerte, pero a esta hora de la madrugada haciendo un proyecto a entregar en 2 días, tu respuesta me ahorro muchísimo tiempo :D ¡Gracias!

  8. Hola Muchas gracias buen aporte.
    Tengo una consulta, Alguien me puede decir qué sentencia es igual a DECLARE de SQL en MySQL?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>