Diferencias entre ENUM y SET en MySQL
In: mysql
24 sep 2009
Existes 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
(bytes)N+7)/8
Conociendo más a fondo los tipos de campos, y sabiendo sus posibilidades, ahora es fácil decidirse y justicarse.
Entradas relacionadas:
- Tags: mysql

4 Comentarios en Diferencias entre ENUM y SET en MySQL
Enrique
10 julio 2010 a las 19:17
Muy buena guia. Estaba buscando esto, Gracias !
Felix Orduz
19 noviembre 2010 a las 20:52
muy bueno pero si quisera que se restringieran los valores del set por los datos de una tabla (integridad referencial) como lo haria?
jose
05 abril 2011 a las 04:35
Muy buena explicación para los no iniciados.
Pablo
17 agosto 2011 a las 10:21
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