Boolean vs tinyint (1) para valores booleanos en MySQL

124

¿Qué tipo de columna es mejor usar en una base de datos MySQL para valores booleanos? Yo uso booleanpero mi colega usa tinyint(1).

tom
fuente
3
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.
Zon

Respuestas:

153

Estos tipos de datos son sinónimos.

Māris Kiseļovs
fuente
66
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.

dj_segfault
fuente
35

booleanno es un tipo de datos distinto en MySQL; es solo un sinónimo de tinyint. 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.

Spudley
fuente
8

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

Pramendra Gupta
fuente
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.
billmalarky
No es cierto para MySQL: BIT(M) - approximately (M+7)/8 bytesver: dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Jens
6

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.

Kyle Morgan
fuente
0

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:

ALTER TABLE 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).

Entonces corrí:

ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;

Lo que resolvió el problema.

smerlung
fuente