Может ли Microsoft хранить трехзначные поля в одном бите? - PullRequest
18 голосов
/ 02 июня 2010

Я совершенно не знаю SQL / баз данных, но я беседовал с другом, который много работает с базами данных о том, как некоторые базы данных используют «логическое» поле, которое может принимать значение NULL в дополнение к true и false .

В связи с этим он сделал следующее замечание: «К чести Microsoft, они никогда не называли такого рода поле логическим, они просто называют его немного. И это правда, если у вас восемь или в записи меньше битовых полей, для их хранения требуется всего один байт. "

Естественно, это кажется мне невозможным - если поле может содержать три значения, вы не поместите восемь из них в байт. Мой друг согласился с тем, что это кажется странным, но попросил незнания внутренних компонентов низкого уровня и сказал, что, насколько он знает, такие поля могут содержать три значения при просмотре со стороны SQL, и для этого требуется байт памяти , Я полагаю, у одного из нас есть провод, пересекающийся. Кто-нибудь может объяснить, что на самом деле здесь происходит?

Ответы [ 5 ]

21 голосов
/ 02 июня 2010

Я рекомендую прочитать это для хорошего объяснения нулевого хранилища: Как SQL Server действительно хранит NULL-s . Короче говоря, нулевой / не нулевой бит хранится в другом месте, нулевой битовый массив для строки.

Из статьи:

Каждая строка имеет нулевое растровое изображение для столбцов, которые допускают нулевые значения. Если строка в этом столбце равна нулю, то бит в битовой карте равен 1, иначе это 0.

Таким образом, хотя фактические значения для 8-битных столбцов хранятся в 1 байте, в нулевом растровом изображении строки есть дополнительные биты, которые указывают, равен ли этот столбец нулю или нет ... так что зависит от того, Считаешь. Чтобы быть полностью точными, 8-битные столбцы используют 2 байта , просто разделенные в 2 разных местах.

7 голосов
/ 02 июня 2010

Нулевой индикатор хранится отдельно, поэтому для обнуляемого бита фактически требуются два бита. И, строго говоря, «ноль» не является третьим значением; это своего рода заполнитель, который говорит: «Здесь может быть значение, но мы не знаем, что это такое». Поэтому, если бит равен нулю, вы можете сравнить его со значением true, и сравнение не удастся, но вы также можете сравнить его со значением false, и сравнение не удастся.

3 голосов
/ 02 июня 2010

Вы правы. Вы можете упаковать восемь значений true / false в один байт, но вам все еще нужно дополнительное хранилище, чтобы указать, является ли оно NULL или нет. Представление 3 8 различных состояний только с 2 8 невозможно.

2 голосов
/ 02 июня 2010

Ваш друг прав, но в то же время неправ. Поле BIT можно рассматривать как способное поддерживать три разных значения, но по определению NULL - это отсутствие значения.

Кроме того, разрешение NULL для битовых полей означает, что для этого поля будут использоваться 2 бита (один для значения и один для значения NULL или нет). Но состояние поля NULL (бит NULL) сохраняется в битовой карте для строки, а не в точном пространстве памяти для данного столбца.

1 голос
/ 02 июня 2010

Другие уже говорили, что для BIT требуется 2 бита, а не один.

Еще один важный момент, который часто забывают: бит в SQL Server не является логическим или логическим типом данных; это числовой (целочисленный) тип данных. "Целочисленный тип данных, который может принимать значение 1, 0 или NULL" . Бит поддерживает только числовые операторы (<,>, +, -). Он не поддерживает ни один из логических операторов (И, ИЛИ, НЕ и т. Д.).

...