Каково значение ПУСТОГО УКАЗАТЕЛЯ в SQL Server?

Я знаю, что ПУСТОЙ УКАЗАТЕЛЬ не является нулем..., ни это - пустая строка. Но затем каково значение ПУСТОГО УКАЗАТЕЛЯ..., который система сохраняет, для идентификации его?

5
задан marc_s 5 June 2010 в 17:04
поделиться

7 ответов

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

10
ответ дан 18 December 2019 в 05:14
поделиться

Формат строки SQL Server описан в MSDN , а также проанализирован в различных блогах, таких как Анатомия записи Пола Рэндала . Важной информацией является структура записи:

  • заголовок записи
    • 4 байта
    • два байта метаданных записи (тип записи)
    • два байта указывают вперед в записи на битовую карту NULL
  • часть записи фиксированной длины, содержащую столбцы, хранящие типы данных, которые имеют фиксированная длина (например, bigint, char (10), datetime)
  • NULL bitmap
    • два байта для подсчета столбцов в записи
    • переменное количество байтов для хранения одного бита на столбец в записи, независимо от того, столбец имеет значение NULL или нет
    • , это позволяет оптимизировать при чтении столбцов, которые имеют значение NULL
  • массив смещения столбца переменной длины
    • два байта для подсчета столбцов переменной длины
    • два байта на столбец переменной длины, что дает смещение до конца тега управления версиями значения столбца
    • 14-байтовая структура, которая содержит метку времени и указатель на хранилище версий в tempdb

Итак, для полей NULL в битовой карте NULL установлен бит.

10
ответ дан 18 December 2019 в 05:14
поделиться

Я сомневаюсь, что интервьюеры хотели, чтобы вы знали, как именно SQL сервер хранит nullы, смысл такого вопроса в том, чтобы заставить вас подумать о том, как вы будете хранить специальные значения. Вы не можете использовать значение sentinel (или магическое число), поскольку в этом случае все строки с таким значением внезапно станут null.

Существует довольно много способов добиться этого. Два самых простых, которые приходят на ум, - это хранить флаг у каждого значения с нулевым значением, который, по сути, является флагом isNull (так же, по сути, работает Nullable в .NET). Второй метод - хранить в каждой строке битовую карту флагов null, по одному на каждый столбец.

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

7
ответ дан 18 December 2019 в 05:14
поделиться

Концептуально, NULL означает "отсутствующее неизвестное значение" и рассматривается несколько иначе, чем другие значения.

В MySQL 0 или NULL означает false, а все остальное - true. Значение истинности по умолчанию для булевых операций равно 1.

Два значения NULL считаются равными в GROUP BY.

При выполнении ORDER BY значения NULL отображаются первыми, если вы выполняете ORDER BY ... ASC и последними, если вы делаете ORDER BY ... DESC.

0
ответ дан 18 December 2019 в 05:14
поделиться

Значение NULL, по сути, означает отсутствующее значение, некоторые люди также будут использовать термин «неизвестно»

Значение NULL также не равно чему-либо, даже другому NULL

Взгляните на эти примеры

напечатает равно

IF 1 = 1
PRINT 'is equaL'
ELSE
PRINT 'NOT equal'

напечатает равно (происходит неявное преобразование)

IF 1 = '1'
PRINT 'is equaL'
ELSE
PRINT 'NOT equal'

напечатает не равно

IF NULL = NULL
PRINT 'is equaL'
ELSE
PRINT 'NOT equal'
0
ответ дан 18 December 2019 в 05:14
поделиться

Как сказал Билл, это состояние, а не ценность.

В строке таблицы SQL Server он хранится в нулевом растровом изображении: на самом деле значение не сохраняется.

Одна из особенностей SQL Server:

SELECT TOP 1 NULL AS foo INTO dbo.bar FROM sys.columns

Какой тип данных - foo? Это, конечно, не имеет значения, но однажды меня это поймало.

3
ответ дан 18 December 2019 в 05:14
поделиться

NULL - это специальный элемент языка SQL, который не является ни равным, ни неравным любому значению в любом типе данных.

Как вы сказали, NULL не является нулем, пустой строкой или false. То есть false = NULL возвращает UNKNOWN.

Некоторые люди говорят, что NULL - это не значение, а состояние. Состояние отсутствия значения. Что-то вроде дзенского коана. :-)

Я не знаю, как именно MS SQL Server хранит его внутри, но это не имеет значения, пока они реализуют его в соответствии со стандартом SQL.

20
ответ дан 18 December 2019 в 05:14
поделиться
Другие вопросы по тегам:

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