Null — пустое значение в информатике¶
Null (от лат. nullus — «никакой, нулевой») — специальное значение в информатике, обозначающее отсутствие данных, пустую ссылку или неопределённость. В большинстве языков программирования и реляционных СУБД null служит маркером того, что переменная, поле или выражение не содержит значимого значения, — в отличие от нуля, пустой строки или логического false, которые являются полноценными данными. Семантика null варьируется от системы к системе: в SQL это трёхзначная логика, в Java — ссылочный тип, в JavaScript — примитив, в C — макрос, указывающий на нулевой адрес.
¶История происхождения
Понятие «отсутствующего значения» возникло вместе с реляционными базами данных. В 1970-х годах Эдгар Кодд, разработавший модель реляционных БД, предложил включить в алгебру отношений особый маркер NULL, чтобы корректно обрабатывать неполные данные — например, неизвестный возраст сотрудника. Кодд обосновал это необходимостью: без NULL пришлось бы использовать «магические» значения (например, −1 для «неизвестно»), что приводило бы к ошибкам вычислений.
В 1980-е годы концепция была реализована в коммерческих СУБД — Oracle, DB2, Informix. Стандарт SQL (ANSI SQL-89, затем SQL-92) закрепил NULL как часть языка запросов, введя трёхзначную логику: помимо истины и лжи появилось состояние «неизвестно».
¶Null в реляционных базах данных
В SQL NULL означает «значение неизвестно» или «отсутствует». Ключевые свойства:
NULLне равно ни одному значению, включая самNULL: выражениеNULL = NULLвозвращаетNULL, а неTRUE.- Арифметические операции с
NULLдаютNULL:5 + NULL = NULL. - Сравнения
NULL > 1,NULL < 1,NULL = 1возвращаютNULL. - Для проверки на
NULLиспользуется конструкцияIS NULL/IS NOT NULL, а не оператор равенства. - При сортировке
NULLобычно размещается в начале или конце списка (в зависимости от СУБД и настроек).
Для обработки NULL в SQL предусмотрены функции: COALESCE(a, b, c) возвращает первое не-NULL значение, NULLIF(a, b) возвращает NULL, если значения равны, ISNULL / NVL — заменяют NULL на заданное значение.
¶Null в языках программирования
¶C и C++
В языке C NULL — это макрос, обычно определяемый как ((void*)0) или 0L, указывающий на нулевой адрес памяти. Разыменование указателя NULL приводит к неопределённому поведению и, как правило, к аварийному завершению программы. В C++11 введён более строгий литерал nullptr — специальный объект типа std::nullptr_t, который нельзя неявно привести к целочисленным типам, что устраняет неоднозначности старого NULL.
¶Java
В Java null — это значение ссылочного типа, не принадлежащее ни одному классу. Попытка вызвать метод у null вызывает NullPointerException — одно из самых частых исключений в Java-приложениях. Для борьбы с ним в Java 8 появились классы Optional<T>, а в Java 14 — улучшенные сообщения об ошибках, указывающие, какой именно объект оказался null.
¶JavaScript
В JavaScript null — примитив, обозначающий «намеренно отсутствующее значение». Он отличается от undefined, который означает, что переменная объявлена, но ей не присвоено значение (или свойство объекта не существует). Оператор === строго разделяет оба значения: null === undefined — false, но null == undefined — true (нестрогое сравнение).
¶Python
В Python аналогом null является None — единственный экземпляр класса NoneType. Идиоматичная проверка — x is None, а не x == None, поскольку оператор is сравнивает идентичность объектов.
¶SQL-подобные и другие языки
В PHP null — один из восьми примитивов; проверка выполняется через is_null() или === null. В Go отсутствие значения возвращает функция вторым результатом: v, ok := m[key], где ok == false означает, что ключа нет. В Rust аналог — Option<T>, тип с вариантами Some(value) и None.
¶Философия и критика
Использование null неоднократно критиковалось. Тони Хоар, изобретатель алгоритма быстрой сортировки, в 2009 году назвал null «миллиардной ошибкой», заявив, что изобрёл его в 1965 году для языка ALGOL W и сожалеет об этом. Критики указывают, что null нарушает типобезопасность: компилятор не может проверить, что значение не является null, поэтому ошибки обнаруживаются только во время выполнения. В качестве альтернатив предлагаются типы Option / Maybe (Haskell, Rust, Scala), заставляющие программиста явно обрабатывать отсутствие значения.
¶Применение
Null применяется везде, где данные могут быть неполными: базы данных (отсутствующие атрибуты), сетевые протоколы (маркер конца данных), файловые форматы (специальные значения-заглушки), пользовательские интерфейсы (пустые поля ввода). В JSON null — один из шести примитивов наряду со строкой, числом, логическим значением, массивом и объектом.
¶Источники
- Кодд Э. Ф. «A Relational Model of Data for Large Shared Data Banks» (1970)
- ISO/IEC 9075:2016 — стандарт SQL
- Хоар Т. «Null References: The Billion Dollar Mistake» (2009)
- Страуструп Б. «The C++ Programming Language»
- Гиллс К. «SQL Pocket Guide» (O'Reilly)
