Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Из статьи:

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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