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


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.


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.


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.


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


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.