18

I'm completely ignorant of SQL/databases, but I was chatting with a friend who does a lot of database work about how some databases use a "boolean" field that can take a value of NULL in addition to true and false.

Regarding this, he made a comment along these lines: "To Microsoft's credit, they have never referred to that kind of field as a boolean, they just call it a bit. And it's a true bit - if you have eight or fewer bit fields in a record, it only requires one byte to store them all."

Naturally that seems impossible to me - if the field can hold three values you're not going to fit eight of them into a byte. My friend agreed that it seemed odd, but begged ignorance of the low-level internals and said that so far as he knew, such fields can hold three values when viewed from the SQL side, and it does work out to require a byte of storage. I imagine one of us has a wire crossed. Can anyone explain what's really going on here?

4

5 に答える 5

21

nullストレージの適切な説明については、これを読むことをお勧めします。SQLServerは実際にNULL-sをどのように格納しますか。つまり、null / not nullビットは別の場所、つまり行のnullビットビットに格納されます。

記事から:

各行には、nullを許可する列のnullビットマップがあります。その列の行がnullの場合、ビットマップのビットは1であり、それ以外の場合は0です。

したがって、8ビット列の実際のは1バイトに格納されますが、行のnullビットマップには、その列がNULLであるかどうかを示す余分なビットがあります...したがって、カウント方法によって異なります。完全に正確に言うと、8ビット列は2バイトを使用し 2つの異なる場所に分割するだけです。

于 2010-06-02T03:08:37.913 に答える
7

nullインジケータは個別に格納されるため、null許容ビットには実際には2ビットが必要です。そして厳密に言えば、「null」は3番目の値ではありません。これは、「ここには価値があるかもしれませんが、それが何であるかはわかりません」というプレースホルダーのようなものです。したがって、ビットがnullの場合、それをtrueと比較すると比較は失敗しますが、falseと比較すると、比較は失敗します。

于 2010-06-02T03:07:43.030 に答える
3

あなたは正しいです。8つのtrue/false値を1バイトにパックできますが、それがNULLかどうかを示すために追加のストレージが必要です。28だけで38の異なる状態を表すことは不可能です。

于 2010-06-02T03:08:04.370 に答える
2

あなたの友達は正しいですが、同時に間違っています。BITフィールドが3つの異なる値を維持できると見なされる可能性がありますが、定義上、NULLは値がないことを意味します。

さらに、ビットフィールドでNULLを許可すると、そのフィールドに2ビットが使用されることを意味します(1つは値に、もう1つはNULLかどうかに使用されます)。ただし、フィールドのNULL状態(NULLビット)は、指定された列の正確なメモリスペースではなく、行のビットマップに格納されます。

于 2010-06-02T03:12:00.557 に答える
1

BITには1ビットではなく2ビットが必要であるとすでに言っている人もいます。

忘れられがちなもう1つの重要な点:SQL Serverのビットは、ブール型または論理型のデータ型ではありません。これは数値(整数)データ型です。「1、0、またはNULLの値を取ることができる整数データ型」。ビットは数値演算子(<、>、+、-)のみをサポートします。論理演算子(AND、OR、NOTなど)はサポートされていません。

于 2010-06-02T07:36:17.467 に答える