#строки #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 очень удобен именно как признак того, что у переменной вообще нет никакого значения, даже пустого. Например, для организации мемоизации. #includeint 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 = "Муслиев" & "Колабельды" & "" Меньше возни с исключениями...
Комментариев нет:
Отправить комментарий