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.
booleanlevará um byte mesmo que seja apenas um pouco, então um BIT (1) é melhor após a v5.0.3?
BOOL/ BOOLEANsejam apelidos para em TINYINT(1)vez de BIT. Claro, todos eles acabam ocupando um byte inteiro, mas semanticamente BITseria 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