Я знаю, что эта тема немного противоречива, и в Интернете много разных статей / мнений. К сожалению, большинство из них предполагают, что человек не знает, в чем разница между NULL и пустой строкой. Таким образом, они рассказывают истории об удивительных результатах с объединениями / агрегатами и обычно делают более продвинутые уроки SQL. Делая это, они абсолютно упускают из виду весь смысл и поэтому бесполезны для меня. Поэтому, надеюсь, этот вопрос и все ответы будут продвигать тему немного вперед.
Предположим, у меня есть таблица с личной информацией (имя, рождение и т. Д.), Где один из столбцов - это адрес электронной почты с типом varchar. Мы предполагаем, что по некоторым причинам некоторые люди могут не захотеть предоставлять адрес электронной почты. При вставке таких данных (без электронной почты) в таблицу доступны два варианта: установить для ячейки значение NULL или установить для нее пустую строку (''). Давайте предположим, что мне известны все технические последствия выбора одного решения вместо другого, и я могу создавать правильные запросы SQL для любого сценария. Проблема в том, что даже когда оба значения отличаются на техническом уровне, они одинаковы на логическом уровне. Посмотрев на NULL и «», я пришел к единственному выводу: я не знаю адреса электронной почты этого парня. Кроме того, как бы я ни старался, Я не смог отправить электронное письмо, используя NULL или пустую строку, поэтому, очевидно, большинство SMTP-серверов согласны с моей логикой. Поэтому я склонен использовать NULL там, где я не знаю значения и считаю пустую строку плохой вещью.
После нескольких интенсивных бесед с коллегами я пришел с двумя вопросами:
Прав ли я, полагая, что использование пустой строки для неизвестного значения приводит к тому, что база данных «лжет» о фактах? Чтобы быть более точным: используя представление SQL о том, что является ценностью, а что нет, я мог бы прийти к выводу: у нас есть адрес электронной почты, просто обнаружив, что он не является нулевым. Но потом, когда я попытаюсь отправить электронное письмо, я приду к противоречивому выводу: нет, у нас нет адреса электронной почты, потому что база данных @! # $ Должна была лгать!
Существует ли какой-либо логический сценарий, в котором пустая строка '' могла бы быть таким хорошим носителем важной информации (помимо значения и отсутствия значения), которую было бы проблематичным / неэффективным хранить любым другим способом (например, дополнительным столбцом). Я видел много постов, утверждающих, что иногда полезно использовать пустую строку вместе с реальными значениями и значениями NULL, но до сих пор не видел сценарий, который был бы логичным (с точки зрения дизайна SQL / DB).
PS У некоторых людей возникнет соблазн ответить, что это вопрос личного вкуса. Я не согласна Для меня это дизайнерское решение с важными последствиями. Поэтому я хотел бы увидеть ответы, в которых мнение об этом подкреплено какими-то логическими и / или техническими причинами.
''
даже в Oracle это не так, как NULL
. Например, присвоение CHAR(1)
столбцу значения ''
приведет к ' '
(то есть к пробелу), а не к NULL
. Кроме того, если бы Яцек использовал Oracle, этот вопрос, вероятно, даже не поднимался бы :-)
'' IS NULL
оценивается true
в PL / SQL.