¿Cuál es la diferencia entre BIT y TINYINT en MySQL?

106

¿En qué casos usarías cuál? ¿Hay mucha diferencia? ¿Cuál utilizo normalmente por los motores de persistencia para almacenar valores booleanos?

portador
fuente

Respuestas:

122

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.

Robert Gamble
fuente
10
¿Cuál es la diferencia entre un TINYINT y un BIT (8)?
Pacerier
16
TINYINT puede tener o no firmar y relacionarse con números negativos. Bit simplemente almacena los bits sin firmar datos, usted mismo debe interpretar el MSB.
define
4
Para evitar confusiones, debe agregarse que TINYINT y BIT (1) no difieren en sus requisitos de almacenamiento y que BOOL y BOOLEAN son sinónimos de TINYINT (1) Descripción general de tipo numérico .
Timo Strotmann
59

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.

Nelson Miranda
fuente
12
¿Está diciendo que booleantomará un byte aunque en realidad sea solo un poco, por lo que un BIT (1) es mejor después de v5.0.3?
Pacerier
3
Sí @Pacerier. Boolean es simplemente un alias feo para un campo numérico.
Áxel Costas Pena
7
En cuanto al almacenamiento real, BIT (1) todavía ocupa un byte mínimo. BIT (M) = (M + 7) / 8 bytes. (1 + 7) / 8 = 1 byte. Consulte Requisitos de almacenamiento de tipo numérico .
Drazen Bjelovuk
1
Es triste que BOOL/ BOOLEANsean alias de en TINYINT(1)lugar de BIT. Seguro, todos acaban ocupando un byte completo, pero semánticamente BITsería mucho más apropiado.
MestreLion
38

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).

Sheldmandu
fuente
1
En mi opinión, no es culpa mía que algunas interfaces, etc., interpreten incorrectamente los datos binarios correctos. Si un administrador (incluyéndome a mí) se queja de algún símbolo (refiriéndose a MySQL Wrokbench), entonces es culpa de quien malinterpretó mis datos correctos (binarios) como un símbolo que no proporciona información sobre el contenido. Entonces MySQL / Oracle cometió el error y no estoy dispuesto a cambiar mi concepto de programación solo porque alguien cometió un error.
Matmarbon
11

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.

Michael Madsen
fuente
4

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.

Allen Hardy
fuente
Lo siento, pensé que estábamos en T_SQL aquí, así que no lo sé
Allen Hardy
0

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

AndreiTiberiu
fuente