Parece que MySQL se trata de forma transparente booleancomo tinyint(1). Así que usted puede utilizar boolean, truey falseMySQL y los trata como tinyint(1), 1y 0.
ADTC
Otro caso es char 1 con Y&N, que se supone que es más rápido para algunas personas.
No diría que los tipos de datos son sinónimos: tinyint (1) es lo mismo que bool, pero tinyint y bool no son lo mismo. Punto menor, pero su respuesta me hizo tropezar la primera vez que lo leí
Kyle Chadha
2
Esto no responde la pregunta. Si bien es cierto que tinyint (1) es funcionalmente idéntico a bool, el OP preguntó qué es lo mejor para usar. La respuesta de @dj_segfault hace un trabajo adecuado explicando por qué se debe preferir bool sobre tinyint (1) al almacenar un valor booleano.
Kyle Morgan el
87
Voy a adoptar un enfoque diferente aquí y sugerir que es tan importante para sus colegas desarrolladores comprender su código como lo es para el compilador / base de datos. Usar booleano puede hacer lo mismo que usar tinyint, sin embargo, tiene la ventaja de transmitir semánticamente cuál es su intención, y eso vale algo.
Si usa una minúscula, no es obvio que los únicos valores que debería ver sean 0 y 1. Un booleano SIEMPRE es verdadero o falso.
Personalmente, sugeriría usar tinyint como preferencia, porque boolean no hace lo que crees que hace del nombre, por lo que genera un código potencialmente engañoso. Pero a nivel práctico, realmente no importa: ambos hacen lo mismo, por lo que no está ganando ni perdiendo nada al usar ninguno.
No podemos usar enum ya que nuestra base de datos también necesita ser compatible con sqlite
tom
11
Si está utilizando InnoDB, el bit termina utilizando tanto espacio como tinyint. De alto rendimiento MySQL (los chicos de Percona) "InnoDB almacena [s] cada columna [bit] como el tipo entero más pequeño lo suficientemente grande como para contener los bits, por lo que no ahorra espacio de almacenamiento". La única ganancia es si está almacenando múltiples valores booleanos en una columna BIT (más de 1). Entonces, si solo tiene un campo booleano, usar tinyint es lo mismo que bit en InnoDB, y es preferible ya que tinyint es generalmente más fácil de trabajar.
Si bien es cierto que booly tinyint(1)son funcionalmente idénticos, booldebería ser la opción preferida, ya que lleva el significado semántico de lo que estás tratando de hacer. Además, muchos ORM se convertirán boolen el tipo booleano nativo de su lenguaje de programación.
Mi experiencia al usar Dapper para conectarse a MySQL es que sí importa . Cambié un bit no anulable (1) a un tinyint anulable (1) usando el siguiente script:
ALTERTABLE TableName MODIFY Setting BOOLEAN null;
Entonces Dapper comenzó a lanzar Excepciones. Traté de ver la diferencia antes y después del guión. Y noté que el bit (1) había cambiado a tinyint (1).
boolean
comotinyint(1)
. Así que usted puede utilizarboolean
,true
yfalse
MySQL y los trata comotinyint(1)
,1
y0
.Respuestas:
Estos tipos de datos son sinónimos.
fuente
Voy a adoptar un enfoque diferente aquí y sugerir que es tan importante para sus colegas desarrolladores comprender su código como lo es para el compilador / base de datos. Usar booleano puede hacer lo mismo que usar tinyint, sin embargo, tiene la ventaja de transmitir semánticamente cuál es su intención, y eso vale algo.
Si usa una minúscula, no es obvio que los únicos valores que debería ver sean 0 y 1. Un booleano SIEMPRE es verdadero o falso.
fuente
boolean
no es un tipo de datos distinto en MySQL; es solo un sinónimo detinyint
. Vea esta página en el manual de MySQL .Personalmente, sugeriría usar tinyint como preferencia, porque boolean no hace lo que crees que hace del nombre, por lo que genera un código potencialmente engañoso. Pero a nivel práctico, realmente no importa: ambos hacen lo mismo, por lo que no está ganando ni perdiendo nada al usar ninguno.
fuente
usar enum es el más fácil y rápido
No recomendaré enum o tinyint (1) ya que el bit (1) necesita solo 1 bit para almacenar el valor booleano, mientras que tinyint (1) necesita 8 bits.
árbitro
TINYINT vs ENUM (0, 1) para valores booleanos en MySQL
fuente
BIT(M) - approximately (M+7)/8 bytes
ver: dev.mysql.com/doc/refman/8.0/en/storage-requirements.htmlSi bien es cierto que
bool
ytinyint(1)
son funcionalmente idénticos,bool
debería ser la opción preferida, ya que lleva el significado semántico de lo que estás tratando de hacer. Además, muchos ORM se convertiránbool
en el tipo booleano nativo de su lenguaje de programación.fuente
Mi experiencia al usar Dapper para conectarse a MySQL es que sí importa . Cambié un bit no anulable (1) a un tinyint anulable (1) usando el siguiente script:
Entonces Dapper comenzó a lanzar Excepciones. Traté de ver la diferencia antes y después del guión. Y noté que el bit (1) había cambiado a tinyint (1).
Entonces corrí:
Lo que resolvió el problema.
fuente