2010-09-20 23 views
80

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

+0

Parece que MySQL trata de forma transparente 'boolean' como' tinyint (1) '. Entonces puedes usar 'boolean',' true' y 'false' y MySQL los trata como' tinyint (1) ',' 1' y '0'. – ADTC

+0

Otro caso es Char 1 con Y & N, que se supone que es más rápido para algunas personas. – Zon

Respuesta

99

Estos tipos de datos son sinónimos.

+15

Sí - http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html –

+0

No diría que los datos _types_ son sinónimos - tinyint (1) es lo mismo que bool , pero tinyint y bool no son lo mismo.Punto menor, pero tu respuesta me disparó la primera vez que lo leí –

+0

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 para explicar por qué se debe preferir bool a tinyint (1) cuando se almacena un valor booleano. –

27

boolean no es un tipo de datos distinto en MySQL; es solo un sinónimo de tinyint. See this page in the MySQL manual.

Personalmente, sugiero usar tinyint como preferencia, porque boolean no hace lo que crees que hace desde el nombre, por lo que hace que el código sea potencialmente engañoso. Pero a nivel práctico, realmente no importa; ambos hacen lo mismo, por lo que no estás ganando ni perdiendo nada al usar cualquiera de los dos.

6

uso enumeración su fácil y más rápido el

no le recomiendo enumeración o tinyint (1) como bit (1) sólo necesita 1 bit para almacenar valor booleano mientras tinyint (1) necesita 8 bits.

ref

TINYINT vs ENUM(0, 1) for boolean values in MySQL

+0

No podemos usar enum ya que nuestra base de datos también necesita compatibilidad con sqlite – tom

+6

Si está utilizando InnoDB, bit termina usando tanto espacio como tinyint. De [Alto rendimiento MySQL] (http://www.amazon.com/High-Performance-MySQL-Optimization-Replication/dp/1449314287/) (los tipos percona) "InnoDB almacena [s] cada columna [bit] como el el entero más pequeño es lo suficientemente grande como para contener los bits, por lo que no se guarda ningún espacio de almacenamiento ". La única ganancia es si está almacenando múltiples valores booleanos en una columna BIT (morethan1). Entonces, si solo tiene un campo booleano, usar tinyint es lo mismo que bit en InnoDB, y es preferible ya que tinyint suele ser más fácil de usar. – billmalarky

60

voy a tomar un enfoque diferente aquí y sugieren que es tan importante para sus compañeros desarrolladores a entender el código como lo es para el compilador/base de datos. Usar boolean puede hacer lo mismo que usar tinyint, pero tiene la ventaja de transmitir semánticamente cuál es tu intención, y eso vale la pena.

Si usa una minúscula, no es obvio que los únicos valores que debe ver son 0 y 1. Un booleano SIEMPRE es verdadero o falso.

0

Mi experiencia al usar Dapper para conectarse a MySQL es que sí importa. He cambiado un poco anulable no (1) a un tinyint anulable (1) mediante la siguiente secuencia de comandos:

ALTER TABLE TableName MODIFY Setting BOOLEAN null; 

Entonces Dapper comenzaron a arrojar 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 me encontré:

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

que resolvió el problema.

1

Si bien es cierto que bool y tinyint(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 convertirán bool en el tipo booleano nativo de su lenguaje de programación.

Cuestiones relacionadas