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


¿En qué casos usarías cuál? ¿Hay mucha diferencia? ¿Que normalmente usé por persistence engines para almacenar booleanos?

Author: carrier, 2008-11-14

6 answers

Un TINYINT es un valor entero de 8 bits, un campo de BITS puede almacenar entre 1 bit, BIT(1) y 64 bits, BIT(64). Para valores booleanos, BIT (1) es bastante común.

 103
Author: Robert Gamble,
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
2008-11-14 14:39:01

De 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 extendido en 5.0.5 a MEMORIA, InnoDB, BDB y NDBCLUSTER. Antes de 5.0.3, BIT es un sinónimo de TINYINT(1).

TINYINT [(M)] [SIN SIGNO] [ZEROFILL]

Un entero muy pequeño. El rango firmado es -128 a 127. El rango sin signo es 0 a 255.

Además considere esto;

BOOL, BOOLEANO

Estos tipos son sinónimos de TINYINT(1). Un valor de cero es considerado falso. Los valores distintos de cero son considerado cierto.

 44
Author: Nelson Miranda,
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
2018-09-26 21:01:13

Todas estas discusiones teóricas son geniales, pero en realidad, al menos si está utilizando MySQL y realmente para SQLServer también, es mejor quedarse con datos no binarios para sus booleanos por la simple razón de que es más fácil trabajar con ellos cuando está emitiendo los 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 de BITS es diferente en los dos de ellos. ASÍ que en la práctica tendrá muchas menos molestias si se queda con un tipo de datos numérico. Yo recomendaría que MySQL se adhiera a BOOL o BOOLEAN que se almacena como TINYINT (1). Incluso la forma en que MySQL Workbench y MySQL Administrator muestran el tipo de datos de BITS no es agradable (es un pequeño símbolo para datos binarios). Así que sé práctico y ahórrate las molestias(y desafortunadamente estoy hablando por experiencia).

 31
Author: Sheldmandu,
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
2011-02-08 12:34:06

BIT solo debería permitir 0 y 1 (y NULL, si el campo no está definido como NOT NULL). TINYINT(1) permite cualquier valor que pueda ser almacenado en un solo byte, -128..127 o 0..255 dependiendo de si está o no sin signo (el 1 muestra que tiene la intención de usar solo un dígito, pero no le impide almacenar un valor más grande).

Para versiones anteriores a 5.0.3, BIT se interpreta como TINYINT(1), por lo que no hay ninguna diferencia allí.

El BIT tiene un " esto es un booleano" semántica, y algunas aplicaciones considerarán TINYINT (1) de la misma manera (debido a la forma en que MySQL lo trataba), por lo que las aplicaciones pueden formatear la columna como una casilla de verificación si marcan el tipo y deciden un formato basado en eso.

 9
Author: Michael Madsen,
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
2008-11-14 14:39:25

Podría estar mal pero:

Tinyint es un entero entre 0 y 255

El bit es 1 o 0

Por lo tanto para mí bit es la elección para booleanos

 4
Author: Allen Hardy,
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
2008-11-14 14:36:13

Desde mi experiencia te estoy diciendo que BIT tiene problemas en los tipos de sistema operativo Linux(Ubuntu para ex). 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 BITS.

Bit no es seguro por ahora. Cambié a tinyint(1) y funcionó perfectamente. Quiero decir que solo necesita un valor para diferenciarse si es 1 o 0 y tinyint(1) está bien para eso

 1
Author: AndreiTiberiu,
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
2014-05-05 09:54:14