Em quais casos você usaria qual? Tem muita diferença? O que eu normalmente uso por mecanismos de persistência para armazenar booleanos?
Em quais casos você usaria qual? Tem muita diferença? O que eu normalmente uso por mecanismos de persistência para armazenar booleanos?
Respostas:
Um TINYINT é um valor inteiro de 8 bits, um campo BIT pode armazenar entre 1 bit, BIT (1), e 64 bits, BIT (64). Para valores booleanos, BIT (1) é bastante comum.
Da visão geral dos tipos numéricos ;
BIT [(M)]
Um tipo de campo de bits. M indica o número de bits por valor, de 1 a 64. O padrão é 1 se M for omitido.
Este tipo de dados foi adicionado no MySQL 5.0.3 para MyISAM e estendido no 5.0.5 para MEMORY, InnoDB, BDB e NDBCLUSTER. Antes de 5.0.3, BIT era sinônimo de TINYINT (1).
TINYINT [(M)] [UNSIGNED] [ZEROFILL]
Um número inteiro muito pequeno. O intervalo com sinal é de -128 a 127. O intervalo sem sinal é de 0 a 255.
Além disso, considere isso;
BOOL, BOOLEAN
Esses tipos são sinônimos para TINYINT (1). Um valor zero é considerado falso. Valores diferentes de zero são considerados verdadeiros.
boolean
levará um byte mesmo que seja apenas um pouco, então um BIT (1) é melhor após a v5.0.3?
BOOL
/ BOOLEAN
sejam apelidos para em TINYINT(1)
vez de BIT
. Claro, todos eles acabam ocupando um byte inteiro, mas semanticamente BIT
seria muito mais apropriado.
Todas essas discussões teóricas são ótimas, mas na realidade, pelo menos se você estiver usando MySQL e realmente para SQLServer também, é melhor ficar com dados não binários para seus booleanos pela simples razão de que é mais fácil trabalhar quando você está enviando os dados, consultando e assim por diante. É especialmente importante se você está tentando obter interoperabilidade entre MySQL e SQLServer (ou seja, você sincroniza dados entre os dois), porque o tratamento do tipo de dados BIT é diferente nos dois. ASSIM, na prática, você terá muito menos aborrecimentos se usar um tipo de dados numérico. Eu recomendaria que o MySQL ficasse com BOOL ou BOOLEAN, que é armazenado como TINYINT (1). Mesmo a forma como o MySQL Workbench e o MySQL Administrator exibem o tipo de dados BIT não é agradável (é um pequeno símbolo para dados binários).
O BIT deve permitir apenas 0 e 1 (e NULL, se o campo não for definido como NOT NULL). TINYINT (1) permite qualquer valor que pode ser armazenado em um único byte, -128..127 ou 0..255 dependendo se é ou não sem sinal (o 1 mostra que você pretende usar apenas um único dígito, mas ele usa não impede que você armazene um valor maior).
Para versões anteriores a 5.0.3, BIT é interpretado como TINYINT (1), então não há diferença aqui.
O BIT tem uma semântica "isto é um booleano" e alguns aplicativos consideram o TINYINT (1) da mesma maneira (devido à forma como o MySQL o tratava), então os aplicativos podem formatar a coluna como uma caixa de seleção se marcarem o tipo e decidir sobre um formato com base nisso.
Pode estar errado, mas:
Tinyint é um número inteiro entre 0 e 255
bit é 1 ou 0
Portanto, para mim bit é a escolha dos booleanos
Pela minha experiência, estou dizendo que o BIT tem problemas em tipos de sistemas operacionais Linux (Ubuntu por ex). Desenvolvi meu db em windows e depois de implantar tudo no linux, tive problemas com queries que inseria ou selecionava de tabelas que tinham BIT DATA TYPE.
O bit não é seguro por enquanto. Mudei para tinyint (1) e funcionou perfeitamente. Quero dizer que você só precisa de um valor para diferenciar se é 1 ou 0 e tinyint (1) está ok para isso