Какое значение NULL в SQL Server? - PullRequest
5 голосов
/ 05 июня 2010

Я знаю, что NULL не ноль ... и не пустая строка. Но тогда каково значение NULL ... которое хранит система, чтобы его идентифицировать?

Ответы [ 7 ]

20 голосов
/ 05 июня 2010

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

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

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

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

10 голосов
/ 05 июня 2010

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

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

Таким образом, поля NULL имеют бит, установленный в битовой карте NULL.

10 голосов
/ 05 июня 2010

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

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

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

Есть довольно много способов добиться этого. Наиболее простые 2, которые приходят на ум, - это хранить флаг с каждым значением NULL, которое в основном является флагом isNull (это также в основном то, как Nullable<T> работает в .NET). Второй способ - хранить с каждой строкой растровое изображение пустых флагов, по одному для каждого столбца.

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

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

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

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

Одна особенность SQL Server:

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

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

0 голосов
/ 07 июня 2010

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

Значение 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 голосов
/ 05 июня 2010

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

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

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

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

...