Qual è la differenza tra BIT e TINYINT in MySQL?


106

In quali casi useresti quale? C'è molta differenza? Quale di solito utilizzo dai motori di persistenza per memorizzare i valori booleani?

Risposte:


122

Un TINYINT è un valore intero a 8 bit, un campo BIT può memorizzare tra 1 bit, BIT (1) e 64 bit, BIT (64). Per valori booleani, BIT (1) è piuttosto comune.


10
qual è la differenza tra un TINYINT e un BIT (8)?
Pacerier

16
TINYINT può essere firmato o non firmato e si riferisce a numeri negativi. Bit memorizza semplicemente i bit senza firmare i dati, sei lasciato a interpretare il MSB da solo.
definisce il

4
Per evitare confusione, è necessario aggiungere che TINYINT e BIT (1) non differiscono nei loro requisiti di archiviazione e che BOOL e BOOLEAN sono sinonimi di TINYINT (1) Panoramica del tipo numerico .
Timo Strotmann

59

Dalla panoramica dei tipi numerici ;

BIT [(M)]

Un tipo di campo di bit. M indica il numero di bit per valore, da 1 a 64. Il valore predefinito è 1 se M viene omesso.

Questo tipo di dati è stato aggiunto in MySQL 5.0.3 per MyISAM ed esteso in 5.0.5 a MEMORY, InnoDB, BDB e NDBCLUSTER. Prima di 5.0.3, BIT è un sinonimo di TINYINT (1).

TINYINT [(M)] [UNSIGNED] [ZEROFILL]

Un numero intero molto piccolo. L'intervallo con segno è compreso tra -128 e 127. L'intervallo senza segno è compreso tra 0 e 255.

Considera inoltre questo;

BOOL, BOOLEANO

Questi tipi sono sinonimi di TINYINT (1). Un valore pari a zero è considerato falso. I valori diversi da zero sono considerati veri.


12
Stai dicendo che booleanrichiederà un byte anche se in realtà è solo un po ', quindi un BIT (1) è migliore dopo la v5.0.3?
Pacerier

3
Sì @Pacerier. Boolean è semplicemente un brutto alias per un campo numerico.
Áxel Costas Pena

7
Per quanto riguarda la memoria effettiva, BIT (1) occupa ancora almeno un byte. BIT (M) = (M + 7) / 8 byte. (1 + 7) / 8 = 1 byte. Vedere Requisiti di archiviazione di tipo numerico .
Drazen Bjelovuk

1
Triste che BOOL/ BOOLEANsiano alias per TINYINT(1)invece di BIT. Certo, finiscono per occupare un intero byte, ma semanticamente BITsarebbe molto più appropriato.
MestreLion

38

Tutte queste discussioni teoriche sono fantastiche, ma in realtà, almeno se stai usando MySQL e anche per SQLServer, è meglio attenersi a dati non binari per i tuoi booleani per il semplice motivo che è più facile lavorare con te stai trasmettendo i dati, interrogando e così via. È particolarmente importante se stai cercando di ottenere l'interoperabilità tra MySQL e SQLServer (cioè sincronizzi i dati tra i due), perché la gestione del tipo di dati BIT è diversa nei due. Quindi, in pratica, avrai molti meno problemi se rimani con un tipo di dati numerico. Consiglierei a MySQL di attenersi a BOOL o BOOLEAN che viene memorizzato come TINYINT (1). Anche il modo in cui MySQL Workbench e MySQL Administrator visualizzano il tipo di dati BIT non è carino (è un piccolo simbolo per dati binari).


1
A mio parere non è colpa mia se alcune interfacce ecc. Interpretano i dati binari corretti in modo errato. Se un amministratore (me compreso) si lamenta di qualche simbolo (riferendosi a MySQL Wrokbench), allora è colpa di chi ha interpretato erroneamente i miei dati (binari) corretti come un simbolo che non fornisce informazioni sul contenuto. Quindi MySQL / Oracle ha commesso l'errore e non sono disposto a cambiare il mio concetto di programmazione solo perché qualcuno ha commesso un errore.
Matmarbon

11

BIT dovrebbe consentire solo 0 e 1 (e NULL, se il campo non è definito come NOT NULL). TINYINT (1) consente qualsiasi valore che può essere memorizzato in un singolo byte, -128..127 o 0..255 a seconda che non sia o meno senza segno (l'1 indica che si intende utilizzare solo una cifra, ma lo fa non ti impedisce di memorizzare un valore maggiore).

Per le versioni precedenti alla 5.0.3, BIT viene interpretato come TINYINT (1), quindi non c'è differenza.

BIT ha una semantica "questo è un booleano" e alcune app considereranno TINYINT (1) allo stesso modo (a causa del modo in cui MySQL lo trattava), quindi le app potrebbero formattare la colonna come una casella di controllo se controllano il tipo e decidere un formato basato su quello.


4

Potrebbe essere sbagliato ma:

Tinyint è un numero intero compreso tra 0 e 255

bit è 1 o 0

Quindi per me bit è la scelta per i booleani


Mi dispiace, pensavo fossimo su T_SQL, quindi non lo so
Allen Hardy

0

Dalla mia esperienza ti dico che BIT ha problemi con i tipi di SO Linux (Ubuntu per esempio). Ho sviluppato il mio db su Windows e dopo aver distribuito tutto su Linux, ho avuto problemi con le query che venivano inserite o selezionate da tabelle che avevano BIT DATA TYPE.

Bit non è sicuro per ora. Sono passato a tinyint (1) e ha funzionato perfettamente. Voglio dire che hai solo bisogno di un valore per differenziare se è 1 o 0 e tinyint (1) va bene per quello

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.