Qual é a diferença entre BIT e TINYINT no MySQL?

106

Em quais casos você usaria qual? Tem muita diferença? O que eu normalmente uso por mecanismos de persistência para armazenar booleanos?

transportadora
fonte

Respostas:

122

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.

Robert Gamble
fonte
10
qual é a diferença entre um TINYINT e um BIT (8)?
Pacerier,
16
TINYINT pode ser assinado ou não assinado e se relacionar a números negativos. O bit apenas armazena os bits sem dados de assinatura, você mesmo deve interpretar o MSB.
define
4
Para evitar confusão, deve-se acrescentar que TINYINT e BIT (1) não diferem em seus Requisitos de Armazenamento e que BOOL e BOOLEAN são sinônimos para Visão Geral do Tipo Numérico TINYINT (1) .
Timo Strotmann
59

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.

Nelson Miranda
fonte
12
Você está dizendo que booleanlevará um byte mesmo que seja apenas um pouco, então um BIT (1) é melhor após a v5.0.3?
Pacerier
3
Sim @Pacerier. Boolean é simplesmente um apelido feio para um campo numérico.
Áxel Costas Pena
7
Quanto ao armazenamento real, o BIT (1) ainda ocupa um byte mínimo. BIT (M) = (M + 7) / 8 bytes. (1 + 7) / 8 = 1 byte. Consulte Requisitos de armazenamento de tipo numérico .
Drazen Bjelovuk
1
É triste que BOOL/ BOOLEANsejam apelidos para em TINYINT(1)vez de BIT. Claro, todos eles acabam ocupando um byte inteiro, mas semanticamente BITseria muito mais apropriado.
MestreLion
38

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

Sheldmandu
fonte
1
Na minha opinião, não é minha culpa que algumas interfaces, etc., interpretem os dados binários corretos incorretamente. Se um administrador (incluindo eu) reclamar de algum símbolo (referindo-se ao MySQL Wrokbench), então isso é culpa de quem interpretou mal meus dados corretos (binários) como um símbolo que não fornece informações sobre o conteúdo. Portanto, o MySQL / Oracle cometeu o erro e não estou disposto a mudar meu conceito de programação apenas porque alguém cometeu um erro.
Matmarbon,
11

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

Michael Madsen
fonte
4

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

Allen Hardy
fonte
Desculpe, pensei que estávamos em T_SQL aqui, portanto, não sei
Allen Hardy
0

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

AndreiTiberiu
fonte