2010-06-02 5 views
17

Sono completamente all'oscuro di SQL/database, ma stavo chattando con un amico che fa un sacco di database su come alcuni database usano un campo "booleano" che può assumere un valore di NULL oltre a true e false.Microsoft può archiviare i campi a tre valori in un singolo bit?

A tale proposito, ha fatto un commento in questo senso: "A credito di Microsoft, non hanno mai fatto riferimento a quel tipo di campo come un booleano, lo chiamano solo un po 'ed è un po' vero - se ne hai otto o meno campi bit in un record, richiede solo un byte per memorizzarli tutti. "

Naturalmente ciò mi sembra impossibile: se il campo può contenere tre valori, non ne verranno inseriti otto in un byte. Il mio amico era d'accordo sul fatto che fosse strano, ma implorava l'ignoranza degli interni di basso livello e diceva che, per quanto ne sapeva, tali campi possono contenere tre valori se visti dal lato SQL, e funziona per richiedere un byte di memoria . Immagino che uno di noi abbia un cavo attraversato. Qualcuno può spiegare cosa sta succedendo davvero qui?

+16

Jon Skeet può memorizzare campi a tre valori in un singolo bit. –

+0

@codeka hahahahahaha –

+1

Gaahhhhh avrei dovuto vederlo arrivare! – fenomas

risposta

19

Si consiglia di leggere questo per una buona spiegazione della memoria nulla: How does SQL Server really store NULL-s. In breve, il bit null/not null è memorizzato in una posizione diversa, la bitmap null per la riga.

Dall'articolo:

Ogni riga ha un bitmap nullo per le colonne che consentono valori nulli. Se la riga della colonna è null allora un bit nella bitmap è 1 altrimenti è 0.

Così, mentre l'attuale valori per 8 colonne di bit sono immagazzinati in 1 byte, ci sono bit extra nella riga del bitmap null che indica se quella colonna è NULL o no ... quindi dipende da come stai contando. Per essere completamente, le colonne a 8 bit utilizzano 2 byte, divisi in 2 posizioni diverse.

+0

Ah, ho pensato che fosse qualcosa del genere. Grazie per il link ai dettagli cruenti! – fenomas

+0

l'aumento della reputazione deve avere uno degli aumenti più alti di chiunque su SO. Sono stato incuriosito dalla pendenza del tuo grafico rappresentante! –

+0

@Mitch - Haha non l'ho controllato da tempo che è abbastanza bello, grazie per averlo indicato :) –

7

L'indicatore null viene memorizzato separatamente, quindi un bit nullable richiede effettivamente due bit. E in senso stretto, "null" non è un terzo valore; è una sorta di segnaposto che dice: "Potrebbe esserci un valore qui, ma non sappiamo di cosa si tratta". Quindi se un bit è nullo, puoi confrontarlo con true e il confronto fallirà, ma puoi anche confrontarlo con false e il confronto fallirà.

3

Sei corretto. È possibile impacchettare gli otto valori true/false in un singolo byte, ma è comunque necessario disporre di ulteriore spazio di archiviazione per indicare se è NULL o no. Rappresentare 3 diversi stati con solo 2 è impossibile.

2

Il tuo amico ha ragione, ma ha torto allo stesso tempo. È possibile che un campo BIT sia considerato in grado di mantenere tre valori diversi, ma per definizione NULL è l'assenza di un valore.

Inoltre, consentendo NULL sui campi di bit, significa che verranno utilizzati 2 bit per tale campo (uno per il valore e uno per se è NULL o no). Ma lo stato NULL del campo (il bit NULL) è memorizzato in una bitmap per la riga e non nello spazio di memoria esatto per la colonna specificata.

1

Altri hanno già detto che BIT richiede 2 bit, non uno.

Un altro punto importante che viene spesso dimenticato: il bit in SQL Server non è un tipo di dati logico o booleano; è un tipo di dati numerici (interi). "An integer data type that can take a value of 1, 0, or NULL". Bit supporta solo operatori numerici (<,>, +, -).Non supporta nessuno degli operatori logici (AND, OR, NOT, ecc.).

Problemi correlati