2010-11-15 22 views

Respuesta

15

BOOLEAN es un alias para TINYINT (1) y se almacena como un byte de datos.
ENUM ('y', 'n') también se almacena como 1 byte de datos.

Por lo tanto, desde el punto de vista del tamaño de almacenamiento, ninguno es mejor.
Sin embargo, puede almacenar 9 en un campo BOOLEAN y lo aceptará. Entonces, si quieres forzar dos estados solamente, ve por ENUM.

+1

Realmente no tiene sentido usar un 'Enum'. 'TinyInt' es mejor que cualquiera' Boolean' o 'Enum' cuando todo lo que quieres es verdadero/falso. – IAbstract

+6

Como mencioné, puede almacenar fácilmente 9 en un campo BOOLEAN. Dicho esto, 9 se evalúa como VERDADERO en un buen número de idiomas, pero no en MySQL (donde TRUE es simplemente un alias para 1) –

5

TINYINT(1) - parece un booleano, hazlo uno.

Nunca compares internamente con cosas como y cuando hay un booleano (0/1) disponible.

0

Dependiendo del idioma que utilice para interactuar con la base de datos, puede encontrar problemas de mayúsculas y minúsculas utilizando enum, por ejemplo, si su base de datos usa una 'y' minúscula pero su código espera una 'Y' mayúscula. Un bool/tinyint siempre será 0 o 1 (o NULL) por lo que evita este problema.

+1

Esto es incorrecto. Un 'BOOL',' BOOLEAN' o 'TINYINT' puede contener valores distintos de' 0', '1' o' NULL'. Un 'TINYINT (1)' es un * byte *, no un bit. Puede almacenar valores de -127 a 127 (o de 0 a 255 si no está firmado). – Nate

3

Aquí está el problema con el almacenamiento de valores booleanos como una enumeración:

SELECT count(*) FROM people WHERE is_active = true; # => Devuelve 0 porque la verdadera = 'verdadero'

que induzca a error porque:

SELECT count(*) FROM people WHERE is_active = 'true'; # => Devoluciones 10

Si está escribiendo todas sus propias consultas SQL, entonces sabrá que no debe pasar una expresión a su consulta, pero si está utilizando un ORM, se encontrará con problemas desde un ORM será tipi Convierte la expresión en algo que la base de datos que consulta puede entender ('t'/'f' para SQLite; 0/1 para MySQL etc.)

En resumen, mientras que uno no puede ser más rápido que el otro en el nivel de bytes, los booleanos se deben almacenar como expresiones para que puedan compararse con otras expresiones.

Al menos, así es como yo lo veo.

2

Ninguno es mejor para almacenar un solo bit (o booleano). La enumeración tiene una tabla de búsqueda y almacena la respuesta como un entero. El booleano es en realidad solo un alias para "TINYINT (1)" que es técnicamente 8 bits de información. El tipo de datos bit solo almacenará tantos bits como en su definición (como en el tipo varchar), por lo que un bit (1) literalmente solo almacenará un bit. Sin embargo, si solo tiene uno de estos campos, entonces la pregunta es discutible, ya que nada rellenará los bits restantes, por lo que serán espacio no utilizado en cada fila (cantidad de espacio que cada fila se redondea al menos hasta un byte, típicamente 8 bits, por fila).

+0

Como es un número entero, con los valores 0 y 1, también se puede usar en comparaciones, lo que equivale a falso y verdadero – SEoF

0

Una gran cantidad de consejos por defecto es utilizar BOOL/TINYINT(1), pero como se indica en la respuesta a esta https://stackoverflow.com/a/4180982/2045006 permiten variaciones de 9 TRUE.

En muchos casos esto no importa, pero si su columna formará parte de un índice único, entonces esto se convertirá en un gran problema.

En el caso de que use la columna en un índice único, le recomendaría usar BIT(1).

ENUM también funcionaría bien con un índice único (siempre que tenga un conjunto de modos SQL adecuado). Sin embargo, usaría ENUM solo cuando quiera trabajar con representaciones de cadena de verdadero/falso en lugar de valores booleanos reales.