Boolean vs tinyint (1) per i valori booleani in MySQL


124

Quale tipo di colonna è meglio usare in un database MySQL per i valori booleani? Io uso booleanma il mio collega usa tinyint(1).


3
Sembra che MySQL tratti in modo trasparente booleancome tinyint(1). Quindi puoi usare boolean, truee falsee MySQL li tratta come tinyint(1), 1e 0.
ADTC

Un altro caso è char 1 con Y & N che dovrebbe essere più veloce da alcune persone.
Zon

Risposte:


153

Questi tipi di dati sono sinonimi.


6
Non direi che i tipi di dati sono sinonimi: tinyint (1) è uguale a bool, ma tinyint e bool non sono la stessa cosa. Punto minore, ma la tua risposta mi ha fatto inciampare la prima volta che l'ho letta
Kyle Chadha

2
Questo non risponde alla domanda. Sebbene sia vero che tinyint (1) è funzionalmente identico a bool, l'OP ha chiesto quale fosse la soluzione migliore da usare. La risposta di @dj_segfault fa un buon lavoro spiegando perché bool dovrebbe essere preferito a tinyint (1) quando si memorizza un valore booleano.
Kyle Morgan

88

Qui adotterò un approccio diverso e suggerirò che è altrettanto importante che i tuoi colleghi sviluppatori comprendano il tuo codice quanto lo è per il compilatore / database. L'uso di booleano può fare la stessa cosa dell'uso di tinyint, tuttavia ha il vantaggio di trasmettere semanticamente qual è la tua intenzione, e questo vale qualcosa.

Se usi un tinyint, non è ovvio che gli unici valori che dovresti vedere sono 0 e 1. Un booleano è SEMPRE vero o falso.


35

booleannon è un tipo di dati distinto in MySQL; è solo un sinonimo di tinyint. Vedi questa pagina nel manuale MySQL .

Personalmente suggerirei di usare tinyint come preferenza, perché booleano non fa quello che pensi che faccia dal nome, quindi crea codice potenzialmente fuorviante. Ma a livello pratico, non importa: entrambi fanno la stessa cosa, quindi non stai guadagnando o perdendo nulla usando nessuno dei due.


8

usa enum è il più facile e veloce

Non consiglierò enum o tinyint (1) poiché il bit (1) necessita solo di 1 bit per memorizzare il valore booleano mentre tinyint (1) necessita di 8 bit.

arbitro

TINYINT vs ENUM (0, 1) per i valori booleani in MySQL


Non possiamo usare enum poiché anche il nostro database deve supportare sqlite
tom

11
Se stai usando InnoDB, bit finisce per usare lo stesso spazio di tinyint. Da High Performance MySQL (i ragazzi di Percona) "InnoDB memorizza ogni colonna [bit] come il tipo intero più piccolo abbastanza grande da contenere i bit, in modo da non risparmiare spazio di archiviazione." L'unico vantaggio è se si memorizzano più valori booleani in una colonna BIT (morethan1). Quindi, se hai solo un campo booleano, usare tinyint è lo stesso di bit in InnoDB ed è preferibile poiché tinyint è tipicamente più facile da lavorare.
billmalarky

Non vero per MySQL: BIT(M) - approximately (M+7)/8 bytesvedere: dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Jens

6

Mentre è vero che boole tinyint(1)sono funzionalmente identici, booldovrebbe essere l'opzione preferita perché porta il significato semantico di ciò che si sta cercando di fare. Inoltre, molti ORM verranno convertiti boolnel tipo booleano nativo del tuo linguaggio di programmazione.


0

La mia esperienza quando utilizzo Dapper per connettersi a MySQL è che è importante . Ho cambiato un bit non nullable (1) in un tinyint nullable (1) utilizzando lo script seguente:

ALTER TABLE TableName MODIFY Setting BOOLEAN null;

Quindi Dapper ha iniziato a lanciare eccezioni. Ho provato a guardare la differenza prima e dopo la sceneggiatura. E ho notato che il bit (1) era cambiato in tinyint (1).

Ho quindi eseguito:

ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;

Che ha risolto il problema.

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.