Я знаю, что ПУСТОЙ УКАЗАТЕЛЬ не является нулем..., ни это - пустая строка. Но затем каково значение ПУСТОГО УКАЗАТЕЛЯ..., который система сохраняет, для идентификации его?
Я считаю, что для каждого столбца, допускающего нули, строки имеют битовую карту нуля. Если строка в указанном столбце нулевая, то бит в битовой карте равен 1, иначе - 0.
Формат строки SQL Server описан в MSDN , а также проанализирован в различных блогах, таких как Анатомия записи Пола Рэндала . Важной информацией является структура записи:
- заголовок записи
- 4 байта
- два байта метаданных записи (тип записи)
- два байта указывают вперед в записи на битовую карту NULL
- часть записи фиксированной длины, содержащую столбцы, хранящие типы данных, которые имеют фиксированная длина (например, bigint, char (10), datetime)
- NULL bitmap
- два байта для подсчета столбцов в записи
- переменное количество байтов для хранения одного бита на столбец в записи, независимо от того, столбец имеет значение NULL или нет
- , это позволяет оптимизировать при чтении столбцов, которые имеют значение NULL
- массив смещения столбца переменной длины
- два байта для подсчета столбцов переменной длины
- два байта на столбец переменной длины, что дает смещение до конца тега управления версиями значения столбца
- 14-байтовая структура, которая содержит метку времени и указатель на хранилище версий в tempdb
Итак, для полей NULL в битовой карте NULL установлен бит.
Я сомневаюсь, что интервьюеры хотели, чтобы вы знали, как именно SQL сервер хранит null
ы, смысл такого вопроса в том, чтобы заставить вас подумать о том, как вы будете хранить специальные значения. Вы не можете использовать значение sentinel (или магическое число), поскольку в этом случае все строки с таким значением внезапно станут null
.
Существует довольно много способов добиться этого. Два самых простых, которые приходят на ум, - это хранить флаг у каждого значения с нулевым значением, который, по сути, является флагом isNull
(так же, по сути, работает Nullable
в .NET). Второй метод - хранить в каждой строке битовую карту флагов null, по одному на каждый столбец.
Когда вы сталкиваетесь с подобными вопросами на собеседовании, самый худший ответ - сидеть и тупо пялиться. Подумайте вслух, признайтесь, что вы не знаете, как SQL Server это делает, а затем представьте несколько разумно звучащих способов сделать это. Вы также должны быть готовы немного рассказать о том, почему вы предпочли один метод другому и каковы плюсы и минусы каждого из них.
Концептуально, NULL означает "отсутствующее неизвестное значение" и рассматривается несколько иначе, чем другие значения.
В MySQL 0 или NULL означает false, а все остальное - true. Значение истинности по умолчанию для булевых операций равно 1.
Два значения NULL считаются равными в GROUP BY.
При выполнении ORDER BY значения NULL отображаются первыми, если вы выполняете ORDER BY ... ASC и последними, если вы делаете ORDER BY ... DESC.
Значение 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'
Как сказал Билл, это состояние, а не ценность.
В строке таблицы SQL Server он хранится в нулевом растровом изображении: на самом деле значение не сохраняется.
Одна из особенностей SQL Server:
SELECT TOP 1 NULL AS foo INTO dbo.bar FROM sys.columns
Какой тип данных - foo? Это, конечно, не имеет значения, но однажды меня это поймало.
NULL - это специальный элемент языка SQL, который не является ни равным, ни неравным любому значению в любом типе данных.
Как вы сказали, NULL не является нулем, пустой строкой или false
. То есть false = NULL
возвращает UNKNOWN
.
Некоторые люди говорят, что NULL - это не значение, а состояние. Состояние отсутствия значения. Что-то вроде дзенского коана. :-)
Я не знаю, как именно MS SQL Server хранит его внутри, но это не имеет значения, пока они реализуют его в соответствии со стандартом SQL.