true - query boolean mysql




Qué tipo de datos MySQL usar para almacenar valores booleanos (8)

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


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.



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





sqldatatypes