Pregunta Qué tipo de datos MySQL usar para almacenar valores booleanos


Dado que MySQL no parece tener ningún tipo de datos "booleanos", ¿qué tipo de datos "abusa" para almacenar información verdadera / falsa en MySQL?

Especialmente en el contexto de escritura y lectura de / a un script PHP.

Con el tiempo, he usado y visto varios enfoques:

  • tinyint, varchar fields que contienen los valores 0/1,
  • Los campos varchar contienen las cadenas '0' / '1' o 'verdadero' / 'falso'
  • y finalmente enum Fields que contienen las dos opciones 'verdadero' / 'falso'.

Ninguno de los anteriores parece óptimo. Tiendo a preferir la variante tinyint 0/1, ya que la conversión de tipo automática en PHP me da valores booleanos de forma bastante simple.

Entonces, ¿qué tipo de datos usas? ¿Hay algún tipo diseñado para valores booleanos que he pasado por alto? ¿Ves alguna ventaja / desventaja al usar un tipo u otro?


990
2017-11-14 10:36


origen


Respuestas:


Para MySQL 5.0.3 y superior, puede usar BIT. El manual dice:

A partir de MySQL 5.0.3, el tipo de datos BIT se usa para almacenar el campo de bits   valores. Un tipo de BIT (M) habilita el almacenamiento de valores de M-bit. M puede variar   de 1 a 64.

De lo contrario, de acuerdo con el manual de MySQL puede usar bool y boolean que son en este momento alias de tinyint(1):

Bool, Boolean: estos tipos son sinónimos de TINYINT(1) Un valor de   cero se considera falso. Distinto de cero   los valores se consideran verdaderos

MySQL también afirma que:

Tenemos la intención de implementar booleano completo   tipo de manejo, de acuerdo con   SQL estándar, en un futuro MySQL   lanzamiento.

Referencias http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html

Por cierto: esto es solo una cuestión de https://google.com/search?q=mysql+boolean+datatype.

Es curioso, este enlace, publicado hace unos años, se ha vuelto recursivo.


1064
2017-11-14 10:50



BOOL y BOOLEAN son sinónimos de TINYINT(1). Zero es false, cualquier otra cosa es true. Más información aquí.


200
2017-11-14 10:55



Esta es una solución elegante que aprecio bastante porque usa cero bytes de datos:

some_flag CHAR(0) DEFAULT NULL

Para establecerlo en verdadero, establezca some_flag = '' y para establecerlo en falso, establecer some_flag = NULL.

Luego, para verificar si es cierto, compruebe si alguna_flag IS NOT NULL, y para comprobar si es falso, comprueba si alguna_flag IS NULL.

(Este método se describe en "Alto rendimiento MySQL: optimización, copias de seguridad, duplicación y más" por Jon Warren Lentz, Baron Schwartz y Arjen Lentz).


64
2018-02-10 18:09



Esta pregunta ha sido respondida, pero calculé que pondría mi $ 0.02. A menudo uso un CHAR (0), donde '' == verdadero y NULL == falso.

De documentos de mysql

CHAR (0) también es bastante agradable cuando necesitas una columna que solo puede tomar   dos valores: una columna que se define como CHAR (0) NULL ocupa solo uno   bit y puede tomar solo los valores NULL y '' (la cadena vacía).


32
2018-04-30 17:39



Si usa el tipo BOOLEAN, esto se alias a TINYINT (1). Esto es mejor si desea utilizar SQL estandarizado y no le molesta que el campo contenga un valor fuera de rango (básicamente, todo lo que no sea 0 será "verdadero").

ENUM ('False', 'True') le permitirá usar las cadenas en su SQL, y MySQL almacenará el campo internamente como un entero donde 'False' = 0 y 'True' = 1 basado en el orden en que se especifica Enum .

En MySQL 5+ puede usar un campo BIT (1) para indicar un tipo numérico de 1 bit. No creo que esto realmente use menos espacio en el almacenamiento, pero de nuevo le permite restringir los valores posibles a 1 o 0.

Todo lo anterior utilizará aproximadamente la misma cantidad de almacenamiento, por lo que es mejor elegir el que le resulte más fácil de usar.


28
2017-11-14 14:59



Uso TINYINT (1) para almacenar valores booleanos en Mysql.

No sé si hay alguna ventaja para usar esto ... Pero si no estoy equivocado, mysql puede almacenar boolean (BOOL) y almacenarlo como tinyint (1)

http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html


16
2017-11-14 10:42



Bit es solo ventajoso sobre las diversas opciones de bytes (tinyint, enum, char (1)) si tiene muchos campos booleanos. Un campo de un bit todavía ocupa un byte completo. Dos campos de bit encajan en el mismo byte. Tres, cuatro, cinco, seis, siete, ocho. Después de lo cual comienzan a llenar el siguiente byte. En última instancia, los ahorros son muy pequeños, hay miles de otras optimizaciones en las que debe concentrarse. A menos que tenga que lidiar con una gran cantidad de datos, esos pocos bytes no sumarán mucho. Si está utilizando bit con PHP, necesita encasillar los valores que entran y salen.


14
2018-01-12 16:18



Hasta que MySQL implemente un tipo de datos bit, si su procesamiento está realmente presionado para el espacio y / o el tiempo, como en el caso de las transacciones de gran volumen, cree un campo TINYINT llamado bit_flags para todas sus variables booleanas, y enmascare y cambie el bit booleano que desee en su consulta SQL.

Por ejemplo, si su bit de la izquierda representa su campo bool, y los 7 bits de la derecha no representan nada, entonces su bit_flags el campo será igual a 128 (binario 10000000). Enmascare (oculte) los siete bits situados más a la derecha (utilizando el operador bit a bit &), y cambie el octavo bit a siete espacios a la derecha, terminando con 00000001. Ahora el valor de este es el número completo (que, en este caso, es 1).

SELECT (t.bit_flags & 128) >> 7 AS myBool FROM myTable t;

if bit_flags = 128 ==> 1 (true)
if bit_flags = 0 ==> 0 (false)

Puede ejecutar declaraciones como estas mientras prueba

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

etc.

Como tiene 8 bits, tiene potencialmente 8 variables booleanas de un byte. Algún futuro programador invariablemente usará los siguientes siete bits, así que debe máscara. No se cambie, o creará un infierno para usted y los demás en el futuro. Asegúrese de que MySQL haga su enmascaramiento y desplazamiento: esto será mucho más rápido que hacerlo con el lenguaje de scripting web (PHP, ASP, etc.). Además, asegúrese de colocar un comentario en el campo de comentarios de MySQL para su bit_flags campo.

Encontrarás estos sitios útiles cuando implementes este método:


12
2017-07-13 17:13