¿Hay razones para no almacenar valores booleanos en SQL como tipos de datos de bits?


¿Hay razones para no almacenar valores booleanos en SQL como tipos de datos de bits sin NULL? Los veo a menudo almacenados como enteros sin restricciones para limitar los valores a 0 y 1, y como cadenas con cosas como T/F, Verdadero/Falso, sí/no, etc., de nuevo sin restricciones. ¿No es mejor almacenarlos como bits y no tener que preocuparse por restricciones adicionales? ¿Qué me estoy perdiendo aquí?

 33
Author: Raedwald, 2009-04-22

11 answers

Siempre me quedaría con el tipo de datos más pequeño que pueda almacenar esto.

  • SQLServer: BIT
  • Oracle: NUMBER(1) (o BOOLEANO en PL/SQL)
  • MySQL: TINYINT (iirc BOOLEAN mapea esto automáticamente)

Editar: el BOOLEANO de Oracle es solo PL/SQL, no la definición de tabla. Respuesta actualizada para reflejar esto.

 45
Author: Powerlord,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-22 13:49:54

Lo que normalmente sucede en el camino es que alguien quiere agregar también un tal vez a sí y no, si tiene un poco, entonces ahora tiene que cambiar todo su código a tinyint

Si tuvieras tinyint para empezar, entonces no lo tienes.....créeme, esto sucede más de lo que piensas

 12
Author: SQLMenace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-22 13:50:11

Los veo a menudo almacenados como enteros sin restricciones a los valores límite a 0 y 1, y como cuerdas con cosas como T / F, Verdadero / Falso, sí / no, etc., de nuevo sin restricciones. ¿No es mejor almacenarlos como bits y no tiene que preocuparse por adicional ¿restricciones?

¡Sí!

¿Qué me estoy perdiendo aquí?

En realidad debería ser "¿qué no me estoy perdiendo aquí?"y la respuesta sería: sentido común .

 8
Author: TheTXI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-22 13:51:11

Cuando quiero booleanos en la base de datos siempre uso el tipo de datos de bits. En SQL pueden ser NULL. Pero al ejecutar su programa tendrá que considerar que un bool (por ejemplo, en C#) es un tipo de valor que en este caso no puede ser NULL. Tendrás que comparar con el Sistema.Valor DBNull.

 4
Author: rguerreiro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-22 13:50:19

Siempre almacenamos los datos como un bit, es pequeño, y lo más importante es que este es el caso para el que está diseñado.

Hemos tenido momentos en los que el usuario final iba a trabajar con los datos directamente, y para ellos, Sí/No o Y/N era más legible. En este caso, acabamos de crear una vista que reflejaba la visualización de datos más amigable.

 4
Author: mattruma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-22 13:51:00

BIT es el tipo de datos que normalmente se usa para almacenar valores BOOLEANOS. Simplemente porque si el BIT es 1 entonces su verdadero y 0 entonces su falso. Es así de simple.

 4
Author: TStamper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-22 13:52:48

Algunas razones para no hacerlo incluyen:

No todas las bases de datos tienen un tipo de datos de bits, por lo que se usa int para poder usar backends diferentes

En algunas bases de datos no se puede indexar un campo de bits.

Y a menudo lo que tienes no es verdaderamente verdadero/falso, sí/no sin otras posibilidades. Por ejemplo, puede tener un campo de bits para el estado que significa algo como abierto o cerrado. Pero más tarde te das cuenta de que necesitas cancelar como un estado también.

 4
Author: HLGEM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-22 18:51:34

Utilice Enum si tiene más de dos estados.

 1
Author: sarvesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 09:36:40

Una razón es que la gente no sabe sobre bit o piensa que y/n es más simple para formatear. otra razón es que a veces piensas: hmm tal vez con el tiempo esto será más que un campo bool. y lo haces por si acaso.

No te estás perdiendo nada:)

 0
Author: Mladen Prajdic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-22 13:48:53

Creo que la tercera forma de normalización indicaría que debe tener una tabla que almacene los valores True y False, y haga referencia a eso. Asegúrese de hacer eso con sus fechas también!

Pero ¿quién se adhiere completamente a 3NF de todos modos? ;)

 0
Author: Darren Kopp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-22 14:07:09

Uso mucho bit. Pero a veces quiero tener la capacidad de devolver false - o muchos valores de true (como mensajes de error). Así que si utilizo un int en lugar de booleano puedo doe algo como:

0 = False 1 = Contraseña incorrecta 2 = El nombre de usuario no existe. 3 = Cuenta bloqueada-a muchos intentos fallidos. 4 = Cuenta desactivada.

Y así sucesivamente.

 -1
Author: Jim Evans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-22 14:33:23