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 escribir y leer desde / hacia un script PHP.
Con el tiempo, he usado y visto varios enfoques:
- tinyint, campos varchar que contienen los valores 0/1,
- campos varchar que contienen las cadenas '0' / '1' o 'verdadero' / 'falso'
- y finalmente enum Campos que contienen las dos opciones 'verdadero' / 'falso'.
Nada de lo anterior parece óptimo. Tiendo a preferir la variante tinyint 0/1, ya que la conversión automática de tipos en PHP me da valores booleanos de manera bastante simple.
Entonces, ¿qué tipo de datos utilizas? ¿Hay un tipo diseñado para valores booleanos que he pasado por alto? ¿Ve alguna ventaja / desventaja al usar un tipo u otro?
mysql
boolean
sqldatatypes
Peter Mortensen
fuente
fuente
bit(1)
es un poco ** para importar en Excel. Cambio atinyint(1)
obras.Respuestas:
Para MySQL 5.0.3 y superior, puede usar
BIT
. El manual dice:De lo contrario, de acuerdo con el manual de MySQL, puede usar bool y boolean, que actualmente son alias de tinyint (1):
MySQL también afirma que:
Referencias: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html
fuente
!$boolean
que nunca se evaluará correctamente sin un procesamiento adicional.auto_increment
en una columna que representa un valor booleano?BOOL
yBOOLEAN
son sinónimos deTINYINT(1)
. Cero esfalse
, cualquier otra cosa estrue
. Más información aquí .fuente
(1)
no hace más que determinar cómo se visualiza el valor, si usted es consciente de tamaño de almacenamiento a continuación, que desea utilizarBIT
en su lugarBIT(1)
yTINYINT(1)
ambos usarán un byte de almacenamiento. Hasta MySQL 5.0.3, enBIT
realidad era sinónimo deTINYINT
. Las versiones posteriores de MySQL cambiaron la implementación de BIT. Pero incluso con el cambio de implementación, todavía no hay un beneficio de "tamaño de almacenamiento" para elBIT
tipo de datos (al menos con InnoDB y MyISAM; otros motores de almacenamiento, por ejemplo, NDB pueden tener alguna optimización de almacenamiento para múltiples declaraciones de columnas BIT). El problema más grande es que algún cliente Las bibliotecas no reconocen ni manejan adecuadamente lasBIT
columnas de tipo de datos devueltas . ATINYINT
funciona mejor.true
" no es cierta.SELECT 'foo' AS bar FROM dual WHERE -7
. La expresión -7 se evalúa en un contexto booleano y la consulta devuelve una fila. Podemos probar con 0, o cualquier expresión que se evalúe como valor entero 0, y no se devuelve ninguna fila. Si la expresión en la cláusula WHERE se evalúa como cualquier valor entero no nulo que no sea cero, la expresión es TRUE. (Creo que los valores decimales y flotantes se "redondean" a entero, por ejemplo, seWHERE 1/3
evalúa aWHERE 0
. Obtenemos el mismo resultado conWHERE 'foo'
, porque la cadena'foo'
también se evalúa a valor entero 0.Esta es una solución elegante que aprecio bastante porque utiliza cero bytes de datos:
Para establecerlo en verdadero, establecer
some_flag = ''
y establecerlo en falso, establecersome_flag = NULL
.Luego, para comprobar si es verdadero, verifique si some_flag
IS NOT NULL
, y para verificar si es falso, verifique si some_flagIS NULL
.(Este método se describe en "MySQL de alto rendimiento: optimización, copias de seguridad, replicación y más" por Jon Warren Lentz, Baron Schwartz y Arjen Lentz).
fuente
COMMENT
en la definición de la columna queNULL
indica falso e''
indica verdadero podría ser de alguna manera muy pequeña para ayudar a la comprensión futura.Si usa el tipo BOOLEAN, este tiene un alias para TINYINT (1). Esto es mejor si desea utilizar 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 en función del orden en que se especifica el 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 restringir los posibles valores 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 para trabajar.
fuente
Esta pregunta ha sido respondida pero pensé que tiraría mis $ 0.02. A menudo uso un
CHAR(0)
, donde'' == true and NULL == false
.De documentos de mysql :
fuente
''
ynull
son valores Falsy.Utilizo TINYINT (1) para almacenar valores booleanos en Mysql.
No sé si hay alguna ventaja en usar esto ... Pero si no me equivoco, mysql puede almacenar boolean (BOOL) y lo almacena como un tinyint (1)
http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html
fuente
El bit solo es ventajoso sobre las diversas opciones de bytes (tinyint, enum, char (1)) si tiene muchos campos booleanos. Un campo de bits aún 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 llenar el siguiente byte. En última instancia, los ahorros son tan pequeños que hay miles de otras optimizaciones en las que debe centrarse. A menos que esté tratando con una enorme cantidad de datos, esos pocos bytes no sumarán mucho. Si está utilizando bit con PHP, debe convertir los valores que entran y salen.
fuente
Hasta que MySQL implemente un tipo de datos de bit, si su procesamiento es realmente presionado por espacio y / o tiempo, como con transacciones de alto volumen, cree un campo TINYINT llamado
bit_flags
para todas sus variables booleanas, y enmascare y cambie el bit booleano que desea en su SQL consulta.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
bit_flags
campo será igual a 128 (10000000 binario). Enmascara (oculta) los siete bits más a la derecha (usando el operador bit a bit&
) y desplaza el octavo bit siete espacios a la derecha, terminando con 00000001. Ahora el número entero (que, en este caso, es 1) es tu valor.Puede ejecutar declaraciones como estas mientras prueba
etc.
Como tiene 8 bits, tiene potencialmente 8 variables booleanas de un byte. Algún programador futuro usará invariablemente los próximos siete bits, por lo que debe enmascarar. No solo cambies, o crearás un infierno para ti y para los demás en el futuro. Asegúrese de que MySQL haga su enmascaramiento y cambio; esto será significativamente más rápido que tener el lenguaje de secuencias de comandos web (PHP, ASP, etc.). Además, asegúrese de colocar un comentario en el campo de comentarios MySQL para su
bit_flags
campo.Encontrarás estos sitios útiles cuando implementes este método:
fuente
VARCHAR
y realice el procedimiento de desenmascaramiento en el código (tampoco es necesario que lo limite a 8 campos) ...BIT
tipo existe. Ver dev.mysql.com/doc/refman/8.0/en/bit-type.htmlMe cansé de tratar de obtener ceros, NULLS y '' redondear 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.
fuente
Refiriéndose a este enlace tipo de datos booleanos en Mysql , de acuerdo con el uso de la aplicación, si uno solo quiere que se almacene 0 o 1, el bit (1) es la mejor opción.
fuente
BIT(1)
solo permitirá que se almacene un valorb'0'
ob'1'
. El mayor problema con elBIT
tipo de datos es que varias bibliotecas de clientes tienen una variedad de manejo inestable del tipo de datos. Verifique el comportamiento en varias herramientas SQL (SQLyog, TOAD para MySQL, SQL Developer), herramientas que "hacen ingeniería inversa" de modelos de bases de datos, y varios clientes, como JDBC, PHP, Perl DBI, y para una buena medida, pruebe algunos marcos ORM ( Hibernate, Mybatis, JPA). En términos de facilidad de uso, la compatibilidad herramienta / marco / soporte nativoTINYINT(1)
es el claro ganador.BIT
yTINYINT
. Consulte la clase JdbcType de MyBatis, mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/…Como MySQL (8.0.16) y MariaDB (10.2.1) implementaron la restricción CHECK, ahora usaría
Usted sólo será capaz de almacenar
0
,1
oNULL
, así como los valores que se pueden convertir a0
o1
sin errores, como'1'
,0x00
,b'1'
oTRUE
/FALSE
.Si no desea permitir NULL, agregue la
NOT NULL
opciónTenga en cuenta que prácticamente no hay diferencia si usa
TINYINT
,TINYINT(1)
oTINYINT(123)
.Si desea que su esquema sea compatible hacia arriba, también puede usar
BOOL
oBOOLEAN
demostración de violín db <>
fuente
ENUM
(debe serenum('0', '1')
- nota: esas son cadenas) no es una buena idea. Hay demasiados problemas debido a cómo se almacena internamente y a cómo se tratan los valores que no son de cadena. P.ej.0
yFALSE
no se puede almacenar.1
yTRUE
convertirse'0'
. Y se2
convierte'1'
.Después de leer las respuestas aquí, decidí usar
bit(1)
y sí, de alguna manera es mejor en espacio / tiempo, PERO después de un tiempo cambié de opinión y nunca lo volveré a usar. Complicó mucho mi desarrollo al usar declaraciones preparadas, bibliotecas, etc. (php).Desde entonces, siempre uso
tinyint(1)
, parece lo suficientemente bueno.fuente
Puede usar el tipo de datos BOOL, BOOLEAN para almacenar valores booleanos.
Sin embargo, el tipo de datos BIT (1) tiene más sentido para almacenar un valor booleano (ya sea verdadero [1] o falso [0]), pero es más fácil trabajar con TINYINT (1) cuando está generando datos, consultas, etc. y para lograr la interoperabilidad entre MySQL y otras bases de datos. También puede consultar esta respuesta o hilo .
Además, lea la documentación
fuente