Da: Sergey Gigoyan | Aggiornato: 2020-06-29 | Commenti | Correlati: Altro > Tipi di dati
Problema
Nello sviluppo di database, ci sono alcuni casi speciali in cui è necessario lavorare con il tipo di dati booleano. Questo è un tipo di dati che permette solo due possibili valori “Vero” o “Falso”. Sicuramente, se una variabile o colonna può avere solo due valori possibili, sarà più facile e logico impostare il suo tipo come booleano. Quindi, SQL Server ha Boolean o un tipo di dati simile? In SQL Server, non esiste un tipo di dati chiamato Boolean. Tuttavia, c’è un tipo di dati chiamato bit che può essere utilizzato per memorizzare valori booleani. In questo articolo, introdurremo ed esploreremo il tipo di dati bit di SQL Server.
Soluzione
Il tipo di dati bit di SQL Server è un tipo di dati intero che può prendere solo uno di questi valori: 0, 1, NULL. Per quanto riguarda la memorizzazione, se ci sono meno di 9 colonne di dati bit nella tabella, sono memorizzati come 1 byte. Se ci sono da 9 a 16 colonne di questo tipo, consumano 2 byte e così via. Così, SQL Server ottimizza la memorizzazione delle colonne del tipo di dati bit. Inoltre, i valori stringa TRUE eFALSE possono essere convertiti in 1 e 0 corrispondenti ai valori bit.
Caratteristiche
Ora esploriamo le caratteristiche e le specifiche del tipo di dati bit. Per prima cosa, come è stato menzionato sopra, le stringhe ‘TRUE’ e ‘FALSE’ sono convertite in 1 e 0. Questo comportamento è illustrato nell’esempio seguente:
DECLARE @isUsed BITDECLARE @isUsedStr NCHAR(5) SELECT @isUsed AS BitType, @isUsedStr AS String --TRUE is converted to 1SET @isUsedStr='TRUE' SET @ SELECT @isUsed AS BitType, @isUsedStr AS String --FALSE is converted to 0SET @isUsedStr='FALSE' SET @ SELECT @isUsed AS BitType, @isUsedStr AS String --Assigning any other string value to a bit variable causes an errorSET @isUsedStr='YES' SET @ SELECT @isUsed AS BitType, @isUsedStr AS String
Nel codice sopra, abbiamo dichiarato due variabili – una di tipo bit e l’altra di tipo stringa. Poi, assegniamo la stringa a una variabile del tipo di dati bit. Come possiamo vedere, i valori ‘TRUE’ e ‘FALSE’ sono convertiti con successo nei valori corrispondenti (1 e 0) del tipo di dati bit:
Assegnare qualsiasi altra stringa a una variabile bit, tuttavia, causa un errore. Nel nostro esempio, abbiamo assegnato ‘YES’ a una variabile bit e abbiamo ricevuto un errore:
In secondo luogo, è importante menzionare che assegnare qualsiasi valore non zero a un tipo di dati bit lo converte in 1. Nel prossimo esempio, assegniamo degli interi positivi e negativi a una variabile di tipo bit:
DECLARE @isUsed BIT SELECT @isUsed AS BitType --Assigning any nonzero value converts it to 1SET @isUsed=9 SELECT @isUsed AS BitType --Assigning any nonzero value converts it to 1SET @isUsed=-100 SELECT @isUsed AS BitType
Il risultato mostra che in entrambi i casi, il valore della variabile bit è 1:
Vantaggi del tipo di dati bit di SQL Server
Come detto sopra, se abbiamo meno di 9 colonne del tipo di dati bit nella nostra tabella, esse vengono memorizzate come un byte. Quindi, la domanda potrebbe sorgere: perché usare il bit invece di char(1) o tinynint se abbiamo solo una colonna nella tabella che accetta solo valori booleani? Bene, creiamo un ambiente di prova e vediamo l’esempio seguente:
USE masterGO CREATE DATABASE TestDBGO USE TestDBGO CREATE TABLE .( NOT NULL PRIMARY KEY, (1) NULL, NULL, )GO
Abbiamo creato il database TestDB e la tabella di esempio che memorizza i risultati dei test medici dei pazienti. Si presume che il genere possa essere solo ‘Maschio’, ‘Femmina’, ‘Sconosciuto’,’Non definito’ o ‘altro’. Per i primi due casi, useremo ‘M’ e ‘F’ in modo corrispondente e per gli ultimi tre casi, useremo ‘NULL’. Per facilitare il nostro esempio, si suppone anche che i risultati del test possano essere positivi o negativi (NULL sarà considerato come sconosciuto). I tipi di dati (char(1) e tinyint) scelti nella definizione della tabella, tuttavia, non sono sufficienti per implementare questa logica. Dobbiamo assicurarci che le colonne menzionate non possano accettare altri valori. Pertanto, dobbiamo creare dei vincoli di controllo:
USE GO --Adding check constraintsALTER TABLE . WITH CHECK ADD CONSTRAINT CHECK ((='M' OR ='F'))GO ALTER TABLE . CHECK CONSTRAINT GO ALTER TABLE . WITH CHECK ADD CONSTRAINT CHECK ((=(1) OR =(0)))GO
Al contrario, se usiamo il tipo di dati bit per le colonne Gender e Test1Result, non abbiamo bisogno di creare vincoli di controllo:
USE TestDBGO DROP TABLE .GO CREATE TABLE .( NOT NULL PRIMARY KEY, NULL, NULL)GO
Per la colonna Gender, possiamo considerare 1 come maschio, per esempio, 0 come femmina e NULL come sconosciuto, non definito o altro. Per quanto riguarda Test1Result, possiamo considerare 1 come positivo e 0 come negativo.
In termini di ottimizzazione dello stoccaggio, il vantaggio principale è che se abbiamo diverse colonne booleane, usando il tipo bit possiamo ridurre significativamente lo spazio utilizzato. Come semplice esempio, possiamo usare una tabella che memorizza i risultati dei vari test medici dei pazienti (che sono positivi o negativi):
USE TestDBGO DROP TABLE .GO CREATE TABLE .( NOT NULL PRIMARY KEY, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)GO
Qui abbiamo 8 colonne del tipo dati bit e, quindi, 1 byte è usato per memorizzare i valori. Se invece usassimo tinyint o char(1), verrebbe usato 1 byte per ognuno di essi.
Possiamo anche trarre dei vantaggi dall’uso del tipo di dati bit in funzioni o storedprocedures che accettano o restituiscono valori booleani. Supponiamo di aver bisogno di una funzione che verifichi se un paziente è testato o meno. Ovviamente, la funzione restituirà TRUE o FALSE. Quindi, possiamo usare il tipo di dati bit come tipo di valore di ritorno:
USE TestDBGO CREATE FUNCTION isPatientTested( @PatientID INT)RETURNS bitASBEGIN IF EXISTS (SELECT PatientID FROM PatientTestResults WHERE ) RETURN 1 RETURN 0 ENDGONow, we can easily call this boolean function:USE TestDBGO IF (dbo.isPatientTested(1)=1) PRINT 'The patient is tested'ELSE PRINT 'The patient is not tested'
Possiamo vedere che il paziente non è testato perché non c’è un record per il paziente con PatientID=1:
Conclusion
In conclusione, il bit data type può essere abbastanza utile se le colonne o le variabili accettano solo due valori (più NULL). In questi casi, usare il tipo bit invece dei tipi di dati stringa o tinyint può rendere il codice più logico e compatto. Inoltre, poiché SQL Server ottimizza la memorizzazione delle colonne bit, l’uso di questo tipo può far risparmiare spazio di memorizzazione, in particolare se abbiamo più di 8 colonne di tipo bit nella tabella.
Passi successivi
Per trovare maggiori informazioni sull’argomento discusso, seguite i link qui sotto:
- https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql?view=sql-server-ver15
- https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-ver15
Ultimo aggiornamento: 2020-06-29
A proposito l’autore
Vedi tutti i miei consigli
- Altri consigli per sviluppatori di database…