Как NULL хранятся в базе данных? - PullRequest
10 голосов
/ 31 октября 2008

Мне любопытно узнать, как NULL хранятся в базе данных?

Конечно, это зависит от сервера базы данных, но я хотел бы получить общее представление об этом.


Первая попытка:

Предположим, что сервер поместил неопределенное значение (может быть что угодно) в поле для значения NULL.

Не могли бы вы повезти и получить значение NULL с помощью

...WHERE field = 'the undefined value (remember, could be anything...)'

Вторая попытка:

Есть ли на сервере флаг или какие-либо метаданные, указывающие, что это поле равно NULL?

Затем сервер должен прочитать эти метаданные, чтобы проверить поле.

Если метаданные указывают на значение NULL и если в запросе отсутствует «поле IS NULL», тогда запись игнорируется.


Это кажется слишком легким ...

Ответы [ 5 ]

9 голосов
/ 31 октября 2008

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

Проблема с первым методом заключается в том, уверены ли вы, что любое значение, выбранное для ваших данных, не будет отображаться как действительные данные? Для некоторых значений (например, даты или числа с плавающей запятой) это верно. Для других (как целые числа) это неверно.

3 голосов
/ 31 октября 2008

В PostgreSQL он использует необязательную битовую карту с одним битом на столбец (0 - ноль, 1 - не ноль). Если растровое изображение отсутствует, все столбцы не равны нулю.

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

Ссылки:

2 голосов
/ 31 октября 2008

Сервер обычно использует метаинформацию, а не магическое значение. Так что есть место, где указано, является ли поле пустым.

-Adam

1 голос
/ 06 ноября 2008

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

| DBServer     | SpecialValue |
+--------------+--------------+
| 'Oracle'     | 'Glyph'      |
| 'SQL Server' | 'Redmond'    |

; -)

1 голос
/ 01 ноября 2008

IBM Informix Dynamic Server использует специальные значения для обозначения нулей. Например, допустимый диапазон значений для SMALLINT (16-разрядный, со знаком) составляет -32767 .. + 32767. Другое значение, -32768, зарезервировано для указания значения NULL. Аналогично для INTEGER (4-байтовый, со знаком) и BIGINT (8-байтовый, со знаком). Для других типов он использует другие специальные представления (например, все биты 1 для SQL FLOAT и SMALLFLOAT - иначе C double и float соответственно). Это означает, что ему не нужно использовать дополнительное пространство.

IBM DB2 для Linux, Unix, Windows использует дополнительные байты для хранения нулевых индикаторов; AFAIK, он использует отдельный байт для каждого обнуляемого поля, но я могу ошибаться в этой детали.

Итак, как было отмечено, механизмы различаются в зависимости от СУБД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...