Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

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

#строки #null #любой_язык


Нынче вечер пятницы, поэтому мой вопрос не практического, а сугубо философского свойства,
для потрепаться. Каких-то материалов наверняка можно нагуглить, но гуглить неохота,
хочется поговорить.
Есть такая концепция — NULL-значения. Смысл: значение отсутствует, неизвестно, не
имеет смысла и т.п.
Если речь идёт, например, о дате рождения, то заданная дата — это дата рождения,
а NULL означает, что даты рождения гражданина мы по той или иной причине не знаем.
Ну или что он ещё не родился, сидит у мамы в животе.
При этом числовой 0 и NULL несут разную смысловую нагрузку. Если речь идёт, например,
о сумме денег на банковских счетах гражданина, то 0 может означать, что денег у него
нет, а NULL — что мы не знаем, сколько у него денег (не посчитали пока).
Во многих случаях NULL неприменим. Например, в банковском софте в записи о банковском
счёте сумма всегда известна точно — какой же это банк, если он сам не знает, сколько
на счёте денег?
Сказанное выше давно известно, это была прелюдия к вопросу. А вопрос такой:
Если у нас текстовое поле, то в каких случаях пустая строка и NULL несут разную смысловую
нагрузку?
Я думал и не смог придумать ни одного практически применимого примера. Складывается
впечатление, что пустой текст и NULL во всех случаях должны рассматриваться как эквиваленты.
Если позволить себе немного пофилософствовать, то я считаю, причина в том, что текст
— это очень особенный тип, в максимально общем виде выражающий древнюю, докомпьютерную
идею письменности. Вот у нас чистая восковая дощечка, на ней ни хрена нет, пусто. А
потом мы на ней чего-то накарябали стилом и теперь у нас есть текст. Легко заметить,
что «пустой текст» и «отсутствие текста» не различаются никак. Текст выпадает из состояния
«отсутствует» только тогда, когда в нём появляется хотя бы один символ.
Здесь уместно возразить, что NULL может обозначать отсутствие самой восковой дощечки,
однако, возвращаясь к информационным технологиям XXI века, хочется спросить: есть ли
примеры, где это нужно?
А что вы думаете про эквивалентность NULL-а и пустой строки? В каких случаях пустая
строка и NULL несут разную смысловую нагрузку?
Интересны любые примеры и соображения.
P.S. Речь, понятно, не только про классические SQL-СУБД, но про систему типов и значений
в целом, где бы она ни применялась.    


Ответы

Ответ 1



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

Ответ 2



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

Ответ 3



Очень простой пример из жизни баз данных. База данных какой-нибудь больницы. Поле "отчество" допускает состояние пустоты >null<. Мы можем ничего не знать об отчестве от пациента (если он без сознания и без документов), тогда это >null<. И пациент по документам может не иметь отчества - ну, пусто у него в графе "отец". Или он принадлежит народности, где отчеств не бывает. Тогда в базу пишется не >null<, а пустая строка - мы знаем, что отчество есть, и знаем, что оно - пустое.

Ответ 4



NULL очень удобен именно как признак того, что у переменной вообще нет никакого значения, даже пустого. Например, для организации мемоизации. #include int main(void) { char* txt = NULL; for (int i = 0; i < 10; i++) { if (txt == NULL) { txt = "Hello World!"; } puts(txt); } return 0; }

Ответ 5



А в чём филосовское различие NULL(SQL) и null(нулевой указатель)? Судя по статье, в том, что операции сравнения по-разному определены. То есть NULL == NULL; // возвращает NULL или UNKNOWN null == null; // возвращает `true` Отсюда и филосовская разница для строк. Две пустые строки - одно и то же. Два значения NULL - разные вещи. Если надо проверить, что две строки (из внешних данных) равны, лучше использовать концепцию пустых строк, а не NULL.

Ответ 6



Когда из БД тянем несколько десятков параметров и объединяем их в одну строку, гораздо проще заранее сохранять их там (в случае отсутствия данных) в виде пустой строки (""), чем потом, перед объединением, каждый параметр проверять на то, что он не NULL. Dim fio As String = "Муслиев" & "Колабельды" & "" Меньше возни с исключениями...

Комментариев нет:

Отправить комментарий