Booleano vs tinyint (1) para valores booleanos no MySQL

124

Qual tipo de coluna é melhor usar em um banco de dados MySQL para valores booleanos? Eu uso, booleanmas meu colega usa tinyint(1).

tom
fonte
3
Parece que o MySQL trata de forma transparente booleancomo tinyint(1). Assim você pode usar boolean, truee falseMySQL e os trata como tinyint(1), 1e 0.
ADTC
Outro caso é o char 1 com Y&N, que é suposto ser mais rápido por algumas pessoas.
Zon

Respostas:

153

Esses tipos de dados são sinônimos.

Māris Kiseļovs
fonte
6
Eu não diria que os tipos de dados são sinônimos - tinyint (1) é o mesmo que bool, mas tinyint e bool não são os mesmos. Ponto menor, mas a sua resposta tropeçou-me a primeira vez que eu li
Kyle Chadha
2
Isso não responde à pergunta. Embora seja verdade que tinyint (1) é funcionalmente idêntico ao bool, o OP perguntou o que é melhor usar. A resposta de @dj_segfault faz um trabalho adequado, explicando por que o bool deve ser preferido em vez de tinyint (1) ao armazenar um valor booleano.
Kyle Morgan
87

Vou adotar uma abordagem diferente aqui e sugerir que é tão importante para seus colegas desenvolvedores entender seu código quanto o compilador / banco de dados. Usar booleano pode fazer o mesmo que usar tinyint, no entanto, tem a vantagem de transmitir semanticamente qual é a sua intenção e isso vale alguma coisa.

Se você usar um tinyint, não é óbvio que os únicos valores que você deve ver são 0 e 1. Um booleano SEMPRE é verdadeiro ou falso.

dj_segfault
fonte
35

booleannão é um tipo de dados distinto no MySQL; é apenas um sinônimo para tinyint. Veja esta página no manual do MySQL .

Pessoalmente, eu sugiro usar tinyint como preferência, porque booleano não faz o que você acha que faz com o nome, por isso cria um código potencialmente enganoso. Mas, no nível prático, isso realmente não importa - os dois fazem a mesma coisa, então você não está ganhando ou perdendo nada usando os dois.

Spudley
fonte
8

use enum é o mais fácil e rápido

não recomendarei enum ou tinyint (1), pois o bit (1) precisa de apenas 1 bit para armazenar o valor booleano, enquanto o tinyint (1) precisa de 8 bits.

ref

TINYINT vs ENUM (0, 1) para valores booleanos no MySQL

Pramendra Gupta
fonte
Nós não podemos usar enum como nossa base de dados também precisa apoiar sqlite
tom
11
Se você estiver usando o InnoDB, o bit acaba usando tanto espaço quanto tinyint. Do MySQL de alto desempenho (os caras da percona) "O InnoDB armazena cada coluna [bit] como o menor número inteiro grande o suficiente para conter os bits, para que você não economize espaço de armazenamento." O único ganho é se você estiver armazenando vários valores booleanos em uma coluna BIT (mais do que 1). Portanto, se você tiver apenas um campo booleano, usar tinyint é o mesmo que bit no InnoDB e é preferível, já que o tinyint é normalmente mais fácil de trabalhar.
billmalarky
Não é verdade para o MySQL: BIT(M) - approximately (M+7)/8 bytesver: dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Jens
6

Embora seja verdade que boole tinyint(1)sejam funcionalmente idênticos, booldeve ser a opção preferida, pois carrega o significado semântico do que você está tentando fazer. Além disso, muitos ORMs serão convertidos boolno tipo booleano nativo da sua linguagem de programação.

Kyle Morgan
fonte
0

Minha experiência ao usar o Dapper para conectar-se ao MySQL é que isso importa . Alterei um bit não anulável (1) para um tinyint (1) anulável usando o seguinte script:

ALTER TABLE TableName MODIFY Setting BOOLEAN null;

Então Dapper começou a lançar exceções. Eu tentei olhar para a diferença antes e depois do script. E percebeu que o bit (1) havia mudado para tinyint (1).

Eu então corri:

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

O que resolveu o problema.

smerlung
fonte