2012-06-23 36 views
67

Estaba diseñando una base de datos para un sitio donde necesito usar un tipo de fecha booleana para almacenar solo 2 estados, verdadero o falso. Estoy usando MySQL.
Al diseñar la base de datos usando phpMyAdmin, encontré que tengo tanto el tipo de datos BOOLEAN como el tipo de datos TINYINT.
Revisé diferentes artículos, algunos dijeron que TINYINT es lo mismo que BOOLEAN, no hay diferencia. Algunos dicen que BOOLEAN se convierte en TINYINT en MySQL.Confusión BOOLEAN o TINYINT

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

Respuesta

101

MySQL no tiene tipo de datos booleano interna. Utiliza el tipo de datos entero más pequeño - TINYINT.

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

tratar de crear esta tabla -

CREATE TABLE table1 (
    column1 BOOLEAN DEFAULT NULL 
); 

A continuación, ejecute SHOW CREATE TABLE, obtendrá esta salida -

CREATE TABLE `table1` (
    `column1` tinyint(1) DEFAULT NULL 
) 
+25

Hay [bit] (http: //dev.mysql.com/doc/refman/5.5/es/bit-type.html) –

+0

Sí, de verdad. No he pensado en el BIT. – Devart

+1

Pero su respuesta es correcta en todos los demás aspectos. Lo que parece confundir al OP es la existencia de sinónimos. –

21

Las versiones de MySQL con más nuevos tienen el nuevo tipo de datos BIT en el que se puede especifique el número de bits en el campo, por ejemplo BIT(1) para usar como tipo Boolean, porque puede ser solo 0 o 1.

7

A partir de la versión de MySQL 5,1 reference

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

+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 ** toma 1 bit. – mpen

+0

@mpen tnx, he actualizado la respuesta. – fortune

25

Sólo 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 av alue de una columna "BOOLEAN" como "0" o "1", no el esperado (por mí) verdadero/falso. Un desarrollador que está mirando el SQL utilizado para crear una tabla y ve algo como: "algún_BOOLARIO BOOLEAN NOT NULL PREDETE FALSO", podría razonablemente esperar ver resultados verdaderos/falsos 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 una int 0/1, gracias php).

Es un nit, pero lo suficiente como para provocar fallas en las pruebas unitarias.

+1

Como nota adicional, los controladores mysql de PHP extraen todos los tipos de enteros como cadenas. – kojow7