sql mysql sql-server types

sql - Tinyint vs Bit



boolean mysql (15)

No quiero tocar una guerra religiosa aquí, pero parece haber dos escuelas de pensamiento sobre cómo representar los valores booleanos en una base de datos. Algunos dicen que el bit es el tipo de datos apropiado, mientras que otros argumentan que tinyint es mejor.

Las únicas diferencias que conozco son estas:

  • bit : el tamaño de almacenamiento es de 1 bit, los valores posibles son 0 o 1
  • tinyint : el tamaño de almacenamiento es de 1 byte, los valores posibles son 0-255

¿Qué tipo de datos es mejor cuando necesitas representar valores booleanos? ¿Vale la pena tinyint la sobrecarga adicional "por si acaso" que necesita valores> 1?


Boolean, por definición, solo permite dos valores. ¿Por qué necesitarías algo más que un solo bit para esto? si necesita una lógica de estado de tres (o más), entonces use un tipo de datos más grande, pero yo (y lo haría) me quedaré con los campos de bit para la lógica booleana estándar.


Construimos todas nuestras tablas con un campo int "vector". Luego usamos ese campo como una colección de 32 bits que podemos asignar para cualquier propósito. (Potencialmente usando un grupo de bits para un conjunto de estados). Nos evita tener que seguir agregando campos de indicadores si lo olvidamos.


Cuando agrega una columna de bit a su tabla, ocupará un byte completo en cada registro, no solo un bit. Cuando agrega una segunda columna de bit, se almacenará en el mismo byte. La columna del noveno bit requerirá un segundo byte de almacenamiento. Las tablas con columna de 1 bit no obtendrán ningún beneficio de almacenamiento.

Tinyint y bit pueden hacerse funcionar, he usado tanto con éxito como sin preferencia.


Me gusta usar char (1) con ''T'' o ''F''. Sí, se puede abusar de otros valores, pero al menos es fácil de ver en informes u otros lugares donde es más difícil trabajar con valores binarios o binarios.


No creo haber visto lo mencionado anteriormente, pero está el problema de no poder agregar columnas BIT (por ejemplo, MIN, MAX y especialmente SUM). Acabo de probar usando 2008 y el problema todavía está allí. Esa es la razón principal por la que utilizo tinyint últimamente, la otra es que me gusta cómo escalas diminutas, siempre es doloroso cuando su indicador de bit de "dos valores" de repente necesita más valores posibles.



Poco ... a menos que seas del clan "verdadero / falso / archivo no encontrado"

En caso de que no obtuviera la referencia ...

Y en el caso de Linq2SQL, bit funciona con verdadero / falso, lo que hace que sea más fácil programarlo. Hay ventajas para ambos.

Y también hay mantenimiento de programación a considerar. ¿Qué sucede si usted (o un programador interno de tercer año) usa un 2, 3, 25, 41, 167, 200, etc.? ¿Dónde está eso documentado? Los bits son autodocumentados y bastante universales.



Solo intenté agrupar en bit (SQL Server 2k5) y funcionó bien para mí. Me gusta usar el tipo de datos correcto para la aplicación. Si es un campo verdadero / falso, entonces bit es lo que uso ...


Todas estas discusiones teóricas son geniales, pero en realidad, al menos si está utilizando MySQL y realmente también para SQLServer, es mejor quedarse con datos no binarios para sus booleanos por la sencilla razón de que es más fácil trabajar con usted. está emitiendo datos, consultas, etc. Es especialmente importante si está tratando de lograr la interoperabilidad entre MySQL y SQLServer (es decir, sincroniza los datos entre los dos), porque el manejo del tipo de datos BIT es diferente en los dos. ASÍ QUE, en la práctica, tendrás muchas menos complicaciones si te quedas con un tipo de datos numérico. Yo recomendaría que MySQL se quede con BOOL o BOOLEAN, que se almacena como TINYINT (1). Incluso la forma en que MySQL Workbench y MySQL Administrator muestran el tipo de datos BIT no es agradable (es un pequeño símbolo para datos binarios). Así que sea práctico y ahórrese las molestias (y desafortunadamente estoy hablando por experiencia).



Utilizo bit porque me ahorra tener que usar una restricción de verificación, y porque mi ORM convertirá automáticamente el bit en un booleano nulo (C #), que aprecio mucho una vez que se codifica.


Yo uso bits cuando sea apropiado. Aparte de ser semánticamente el tipo correcto (¡cuenta de semántica!), Múltiples campos de bits (hasta 8) en una sola fila (en SQL Server, de todos modos) pueden consolidarse en un único byte de almacenamiento. Después del octavo, se necesita un byte adicional para los siguientes 8, y así sucesivamente.

Referencias


@Kevin: Creo que se puede usar group by campos de bits (SQL Server 2005):

declare @t table ( descr varchar(10), myBit1 bit, myBit2 bit ) insert into @t values (''test1'', 0, 1) insert into @t values (''test2'', 1, 0) insert into @t values (''test3'', 1, 1) insert into @t values (''test4'', 0, 0) select myBit1, count(myBit1) from @t group by myBit1 select myBit2, count(myBit1) from @t group by myBit2

Resultados:

myBit1 ------ ----------- 0 2 1 2 myBit2 ------ ----------- 0 2 1 2


Zero Space for False

Cualquiera que sea su elección, puede establecer NULL lugar de 0 y no ocupará espacio adicional (ya que la base de datos casi siempre tiene un indicador NULL para cada campo de cada fila, simplemente sentado allí, más información aquí ). Si también se asegura de que el valor predeterminado / más probable sea false , ¡ahorrará aún más espacio!

Un poco de espacio para la verdad

El valor para representar true requiere el espacio definido por el tipo de campo; el uso de BIT solo ahorrará espacio si una tabla tiene múltiples columnas, ya que usa un byte por cada 8 campos (frente a TINYINT que usa un byte por campo).

TINYINT tiene la ventaja de permitirle personalizar una bitmask valor 8 sin preocuparse por la administración de un montón de columnas adicionales, y la búsqueda es teóricamente más rápida (un único campo entero frente a varios campos de bits). Pero hay algunas desventajas, como un orden más lento, cosas elegantes de indexación cruzada y la falta de nombres de campo. Cuál para mí es la mayor pérdida; su base de datos requeriría documentación externa para observar qué bits hicieron qué en qué máscaras de bits.

En cualquier caso, evite la tentación de usar campos TEXT para almacenar booleanos o conjuntos de ellos. La búsqueda a través del texto es mucho más trabajo para el servidor, y los esquemas arbitrarios de nombres como "activado, desactivado, desactivado" pueden dañar la interoperabilidad.