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.
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.
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.
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.
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.
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.
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:
ALTERTABLE 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).
boolean
comotinyint(1)
. Assim você pode usarboolean
,true
efalse
MySQL e os trata comotinyint(1)
,1
e0
.Respostas:
Esses tipos de dados são sinônimos.
fonte
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.
fonte
boolean
não é um tipo de dados distinto no MySQL; é apenas um sinônimo paratinyint
. 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.
fonte
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
fonte
BIT(M) - approximately (M+7)/8 bytes
ver: dev.mysql.com/doc/refman/8.0/en/storage-requirements.htmlEmbora seja verdade que
bool
etinyint(1)
sejam funcionalmente idênticos,bool
deve ser a opção preferida, pois carrega o significado semântico do que você está tentando fazer. Além disso, muitos ORMs serão convertidosbool
no tipo booleano nativo da sua linguagem de programação.fonte
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:
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:
O que resolveu o problema.
fonte