Respuestas:
Un TINYINT es un valor entero de 8 bits, un campo BIT puede almacenar entre 1 bit, BIT (1) y 64 bits, BIT (64). Para valores booleanos, BIT (1) es bastante común.
De la descripción general de los tipos numéricos ;
BIT [(M)]
Un tipo de campo de bits. M indica el número de bits por valor, de 1 a 64. El valor predeterminado es 1 si se omite M.
Este tipo de datos se agregó en MySQL 5.0.3 para MyISAM y se extendió en 5.0.5 a MEMORY, InnoDB, BDB y NDBCLUSTER. Antes de 5.0.3, BIT es sinónimo de TINYINT (1).
TINYINT [(M)] [UNSIGNED] [ZEROFILL]
Un número entero muy pequeño. El rango con signo es de -128 a 127. El rango sin signo es de 0 a 255.
Además, considere esto;
BOOL, BOOLEAN
Estos tipos son sinónimos de TINYINT (1). Un valor de cero se considera falso. Los valores distintos de cero se consideran verdaderos.
boolean
tomará un byte aunque en realidad sea solo un poco, por lo que un BIT (1) es mejor después de v5.0.3?
BOOL
/ BOOLEAN
sean alias de en TINYINT(1)
lugar de BIT
. Seguro, todos acaban ocupando un byte completo, pero semánticamente BIT
sería mucho más apropiado.
Todas estas discusiones teóricas son geniales, pero en realidad, al menos si está utilizando MySQL y 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 ellos cuando están generando datos, consultando, etc. Es especialmente importante si está tratando de lograr la interoperabilidad entre MySQL y SQLServer (es decir, sincroniza datos entre los dos), porque el manejo del tipo de datos BIT es diferente en los dos. Entonces, en la práctica, tendrá muchas menos molestias si se queda con un tipo de datos numérico. 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).
BIT solo debe permitir 0 y 1 (y NULL, si el campo no está definido como NOT NULL). TINYINT (1) permite cualquier valor que se pueda almacenar en un solo byte, -128..127 o 0..255 dependiendo de si está sin firmar o no (el 1 muestra que solo tiene la intención de usar un solo dígito, pero no no le impide almacenar un valor mayor).
Para versiones anteriores a la 5.0.3, BIT se interpreta como TINYINT (1), por lo que no hay diferencia.
BIT tiene una semántica "esto es un booleano", y algunas aplicaciones considerarán TINYINT (1) de la misma manera (debido a la forma en que MySQL solía tratarlo), por lo que las aplicaciones pueden formatear la columna como una casilla de verificación si marcan el tipo y decidir un formato basado en eso.
Puede que esté mal pero:
Tinyint es un número entero entre 0 y 255
bit es 1 o 0
Por lo tanto, para mí, bit es la elección de los booleanos.
Por mi experiencia, les digo que BIT tiene problemas con los tipos de sistemas operativos Linux (Ubuntu por ejemplo). Desarrollé mi base de datos en Windows y después de implementar todo en Linux, tuve problemas con las consultas que insertaban o seleccionaban de tablas que tenían TIPO DE DATOS DE BIT.
Bit no es seguro por ahora. Cambié a tinyint (1) y funcionó perfectamente. Quiero decir que solo necesitas un valor para diferenciar si es 1 o 0 y tinyint (1) está bien para eso