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?

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.


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.


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


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


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


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

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.