Текстовые строки и NULL

Рейтинг: 3Ответов: 4Опубликовано: 20.03.2015

Нынче вечер пятницы, поэтому мой вопрос не практического, а сугубо философского свойства, для потрепаться. Каких-то материалов наверняка можно нагуглить, но гуглить неохота, хочется поговорить.

Есть такая концепция — NULL-значения. Смысл: значение отсутствует, неизвестно, не имеет смысла и т.п.

Если речь идёт, например, о дате рождения, то заданная дата — это дата рождения, а NULL означает, что даты рождения гражданина мы по той или иной причине не знаем. Ну или что он ещё не родился, сидит у мамы в животе.

При этом числовой 0 и NULL несут разную смысловую нагрузку. Если речь идёт, например, о сумме денег на банковских счетах гражданина, то 0 может означать, что денег у него нет, а NULL — что мы не знаем, сколько у него денег (не посчитали пока).

Во многих случаях NULL неприменим. Например, в банковском софте в записи о банковском счёте сумма всегда известна точно — какой же это банк, если он сам не знает, сколько на счёте денег?

Сказанное выше давно известно, это была прелюдия к вопросу. А вопрос такой:

Если у нас текстовое поле, то в каких случаях пустая строка и NULL несут разную смысловую нагрузку?

Я думал и не смог придумать ни одного практически применимого примера. Складывается впечатление, что пустой текст и NULL во всех случаях должны рассматриваться как эквиваленты.

Если позволить себе немного пофилософствовать, то я считаю, причина в том, что текст — это очень особенный тип, в максимально общем виде выражающий древнюю, докомпьютерную идею письменности. Вот у нас чистая восковая дощечка, на ней ни хрена нет, пусто. А потом мы на ней чего-то накарябали стилом и теперь у нас есть текст. Легко заметить, что «пустой текст» и «отсутствие текста» не различаются никак. Текст выпадает из состояния «отсутствует» только тогда, когда в нём появляется хотя бы один символ.

Здесь уместно возразить, что NULL может обозначать отсутствие самой восковой дощечки, однако, возвращаясь к информационным технологиям XXI века, хочется спросить: есть ли примеры, где это нужно?

А что вы думаете про эквивалентность NULL-а и пустой строки? В каких случаях пустая строка и NULL несут разную смысловую нагрузку?

Интересны любые примеры и соображения.

P.S. Речь, понятно, не только про классические SQL-СУБД, но про систему типов и значений в целом, где бы она ни применялась.

Ответы

▲ 4

Если у нас текстовое поле, то в каких случаях пустая строка и NULL несут разную смысловую нагрузку?

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

▲ 4

Очень простой пример из жизни баз данных. База данных какой-нибудь больницы.

Поле "отчество" допускает состояние пустоты >null<.

Мы можем ничего не знать об отчестве от пациента (если он без сознания и без документов), тогда это >null<.

И пациент по документам может не иметь отчества - ну, пусто у него в графе "отец". Или он принадлежит народности, где отчеств не бывает. Тогда в базу пишется не >null<, а пустая строка - мы знаем, что отчество есть, и знаем, что оно - пустое.

▲ 3

Да в куче случаев пустая строка и NULL могут иметь разный смысл.

Например, текст инструкции. Если его не загрузили (еще не поместили в систему) -- NULL, а если просто сам текст отсутствует -- пустая строка.

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

▲ 3

NULL очень удобен именно как признак того, что у переменной вообще нет никакого значения, даже пустого. Например, для организации мемоизации.

#include <stdio.h>

int main(void)
{
    char* txt = NULL;
    for (int i = 0; i < 10; i++)
    {
        if (txt == NULL) { txt = "Hello World!"; }
        puts(txt);
    }
    return 0;
}