Confusión BOOLEAN o TINYINT

92

Estaba diseñando una base de datos para un sitio donde necesito usar un tipo de fecha booleano para almacenar solo 2 estados, verdadero o falso. Estoy usando MySQL.
Mientras diseñaba la base de datos usando phpMyAdmin, descubrí que tengo tanto el tipo de datos BOOLEAN como el tipo de datos TINYINT.
Revisé diferentes artículos, algunos decían que TINYINT es lo mismo que BOOLEAN, no hay diferencia. Algunos dicen que BOOLEAN se convierte en TINYINT en MySQL.

MI pregunta es, si ambos son iguales, ¿por qué existen dos? Debería haber solo uno de ellos.

Aquí está la referencia a los artículos que leí:
http://www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type -overview.html

Bipin Chandra Tripathi
fuente

Respuestas:

137

MySQL no tiene un tipo de datos booleano interno. Utiliza el tipo de datos entero más pequeño: TINYINT.

BOOLEAN y BOOL son equivalentes de TINYINT (1), porque son sinónimos.

Intenta crear esta tabla -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

Luego ejecute SHOW CREATE TABLE, obtendrá este resultado:

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)
Devart
fuente
1
Pero tu respuesta es correcta en todos los demás aspectos. Lo que parece confundir al OP es la existencia de sinónimos.
ypercubeᵀᴹ
2
Parece que está hecho por compatibilidad con versiones anteriores. El tipo de datos BOOLEAN era anterior a MySQL 5 y el tipo BIT no estaba optimizado, también era TINYINT. De la documentación - Nuevas funciones planeadas para 5.1: Optimice el tipo de BIT para tomar un bit. (BIT ahora ocupa un byte; se trata como sinónimo de TINYINT).
Devart
5
Sí, se puede saber tener BIT(1)o BIT(17)inclusoBIT(64)
ypercubeᵀᴹ
3
@Devart: donde su respuesta tiene la mayor cantidad de votos y aparece primero (en mi lista de todos modos) y ha pasado algún tiempo, ¿hay alguna posibilidad de que esté dispuesto a agregar a su respuesta para incluir alguna discusión sobre el tipo BIT en MySQL 5.1 y ¿luego?
Jonathan
3
@Jonathan Tal vez mencionarlo sea valioso, sin embargo BIT (1) en realidad no usa menos espacio que TINYINT (1) y no se muestra como la mayoría de la gente esperaría al usar la consola mysql estándar. Debido a esa desventaja, y sin beneficio de almacenamiento, el solo uso de TINYINT (1) o BOOLEAN parece ser lo más común en mi experiencia.
Tyler Smith
31

Solo una nota para los desarrolladores de php (me faltan los puntos de stackoverflow necesarios para publicar esto como un comentario) ... la conversión automática (y silenciosa) a TINYINT significa que php recupera un valor de una columna "BOOLEAN" como un "0" o "1", no el esperado (por mí) verdadero / falso.

Un desarrollador que está mirando el SQL usado para crear una tabla y ve algo como: "algún_booleano BOOLEANO NO NULL DEFAULT FALSE", podría esperar razonablemente ver resultados de verdadero / falso cuando se recupera una fila que contiene esa columna. En cambio (al menos en mi versión de PHP), el resultado será "0" o "1" (sí, una cadena "0" o una cadena "1", no un int 0/1, gracias php).

Es una liendre, pero lo suficiente como para hacer fallar las pruebas unitarias.

Tom Stambaugh
fuente
2
Como nota adicional, los controladores mysql de PHP incorporan todos los tipos de enteros como cadenas.
kojow7
24

Las versiones más recientes de MySQL tienen el nuevo BITtipo de datos en el que puede especificar el número de bits en el campo, por ejemplo, BIT(1)para usar como Booleantipo, porque puede ser solo 0o 1.

Please_Dont_Bully_Me_SO_Lords
fuente
7

A partir de la referencia de la versión MySql 5.1

BIT(M) =  approximately (M+7)/8 bytes, 
BIT(1) =  (1+7)/8 = 1 bytes (8 bits)

================================================ =======================

TINYINT(1) take 8 bits.

https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#data-types-storage-reqs-numeric

fortuna
fuente
1
Su referencia dice que el almacenamiento requerido es en realidad "aproximadamente (M + 7) / 8 bytes". es decir, se redondea al siguiente byte completo. Por lo tanto, no se necesita 1 bit.
mpen