true query false example ejemplo column cast mysql boolean sqldatatypes

query - Qué tipo de datos MySQL usar para almacenar valores booleanos



mysql true false (11)

Como MySQL no parece tener ningún tipo de datos ''booleanos'', ¿qué tipo de datos ''abusan'' para almacenar información verdadera / falsa en MySQL?

Especialmente en el contexto de escribir y leer desde / hacia un script PHP.

Con el tiempo he utilizado y visto varios enfoques:

  • tinyint, campos varchar que contienen los valores 0/1,
  • campos varchar que contienen las cadenas ''0'' / ''1'' o ''true'' / ''false''
  • y finalmente enumere los Campos que contienen las dos opciones ''true'' / ''false''.

Nada de lo anterior parece óptimo. Tiendo a preferir el tinyint 0/1 variante, ya que la conversión automática de tipos en PHP me da valores booleanos en lugar simple.

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


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


Después de leer las respuestas aquí, decidí usar bit(1) y sí, es algo mejor en el espacio / tiempo, PERO después de un tiempo cambié de opinión y nunca lo volveré a usar. Esto complicó mucho mi desarrollo, al usar sentencias preparadas, bibliotecas, etc. (php).

Desde entonces, siempre uso tinyint(1) , parece lo suficientemente bueno.


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, establezca some_flag = NULL .

Luego, para verificar si IS NOT NULL verdadero, verifique si some_flag IS NOT NULL , y para verificar si IS NULL falso, verifique si some_flag IS NULL .

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


Esta pregunta ha sido respondida, pero pensé que iba a tirar mis $ 0.02. A menudo utilizo un CHAR (0), donde '''' == true y NULL == false.

Desde mysql docs

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


Hasta que MySQL implemente un tipo de datos de bits, si su procesamiento es realmente presionado por espacio y / o tiempo, como con transacciones de gran volumen, cree un campo bit_flags llamado bit_flags para todas sus variables booleanas, y enmascare y desplace el bit booleano que desea en su Consulta SQL

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

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 programador futuro usará invariablemente los siguientes siete bits, por lo que debe enmascarar. No se limite a cambiar, o creará un infierno para usted y para otros en el futuro. Asegúrese de que MySQL haga su enmascaramiento y cambio: esto será significativamente más rápido que el lenguaje de scripts web (PHP, ASP, etc.) que lo haga. Además, asegúrese de colocar un comentario en el campo de comentarios de MySQL para su campo bit_flags .

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


Me harté de intentar obtener ceros, NULLS y '''' redondeando con precisión un bucle de valores PHP, MySql y POST, así que solo uso ''Sí'' y ''No''.

Esto funciona perfectamente y no necesita un tratamiento especial que no sea obvio y fácil de hacer.


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

A partir de MySQL 5.0.3, el tipo de datos BIT se utiliza para almacenar valores de campo de bits. Un tipo de BIT (M) permite el almacenamiento de valores de M-bit. M puede ir desde 1 hasta 64.

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

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.

MySQL también establece que:

Tenemos la intención de implementar el manejo de tipo booleano completo, de acuerdo con el estándar SQL, en una futura versión de MySQL.

Referencias: 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.


Refiriéndose a este enlace Tipo de datos booleano en Mysql , de acuerdo con el uso de la aplicación, si uno desea que solo se almacene 0 o 1, el bit (1) es la mejor opción.


Si usa el tipo BOOLEAN, este es un alias de TINYINT (1). Esto es lo mejor si desea usar SQL estandarizado y no le importa que el campo pueda contener 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 según el orden en que se especifique 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 nuevamente le permite limitar los valores posibles a 1 o 0.

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



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