Microsoft может сохранить трехзначные поля в единственном бите?

Я абсолютно незнаком с SQL/базами данных, но я болтал с другом, который делает большую работу базы данных о том, как некоторые базы данных используют "булево" поле, которое может принять значение ПУСТОГО УКАЗАТЕЛЯ в дополнение к истине и лжи.

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

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

18
задан Reinstate Monica 2 June 2010 в 03:09
поделиться

5 ответов

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

Из статьи:

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

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

21
ответ дан 30 November 2019 в 07:38
поделиться

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

7
ответ дан 30 November 2019 в 07:38
поделиться

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

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

1
ответ дан 30 November 2019 в 07:38
поделиться

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

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

2
ответ дан 30 November 2019 в 07:38
поделиться

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

3
ответ дан 30 November 2019 в 07:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: