Столбцы Varchar: Nullable или нет

В стандартах разработки базы данных в нашей организации говорится, что varchar поля не должны позволять нулевые значения. У них должно быть значение по умолчанию пустой строки (""). Я знаю, что это делает запросы и конкатенацию легче, но сегодня, один из моих коллег опросил меня о том, почему тот стандарт только существовал для varchar, вводит не другой типы данных (интервал, дата и время, и т.д.). Я хотел бы знать, полагают ли другие, что это действительный, защитимый стандарт, или если varchar нужно рассматривать то же как поля других типов данных?

Я полагаю, что этот стандарт действителен по следующей причине:

Я полагаю, что пустая строка и нулевые значения, хотя технически отличающийся, являются концептуально тем же. Пустая, строка нулевой длины является строкой, которая не существует. Это не имеет никакого значения. Однако числовое значение 0 не является тем же как ПУСТЫМ УКАЗАТЕЛЕМ.

Например, если поле под названием OutstandingBalance имеет значение 0, это означает, что существует 0,00$, оставаясь. Однако, если то же поле является ПУСТЫМ, который означает, что значение неизвестно. С другой стороны, поле под названием CustomerName со значением "" является в основном тем же как значением ПУСТОГО УКАЗАТЕЛЯ, потому что оба представляют несуществование имени.

Я считал где-нибудь, что аналогия для пустой строки по сравнению с Пустым УКАЗАТЕЛЕМ является аналогией пустого CD по сравнению ни с каким CD. Однако я полагаю, что это ложная аналогия, потому что пустой CD все еще phyically существует и все еще имеет физическое пространство данных, которое не имеет никаких значимых данных записанными в него. В основном я полагаю, что пустой CD является эквивалентом строки пробелов (""), не пустая строка. Поэтому я полагаю, что строка пробелов фактическое значение, отдельное от ПУСТОГО УКАЗАТЕЛЯ, но пустой строки, чтобы быть отсутствием значения, концептуально эквивалентного ПУСТОМУ УКАЗАТЕЛЮ.

Сообщите мне, допустимы ли мои верования относительно строк переменной длины, или просветите меня, если они не. Я прочитал несколько блогов / аргументы относительно этого предмета, но все еще не вижу истинного концептуального различия между ПУСТЫМИ УКАЗАТЕЛЯМИ и пустыми строками.

11
задан DCNYAM 8 June 2010 в 19:59
поделиться

2 ответа

В основном все сводится к следующему - в вашем приложении, для конкретной строки, есть ли разница между пустой строкой и отсутствием строки вообще?

Если разницы нет, то стандарт, которому вы следуете, подходит.

Если вы обнаружите, что разница есть, тогда null имеет отдельное значение и должен быть разрешен.

По моему опыту, null обычно используется для обозначения unknown.

Вот более конкретный пример - средние имена людей:

  • Если вы знаете второе имя, то значение заполняется
  • Если вы знаете, что у человека нет второго имени, то используйте пустую строку ('')
  • Если вы не знаете, есть ли у человека второе имя, то null может быть более подходящим

Опять же, если ваше приложение одинаково относится к людям без второго имени и тем, у кого оно неизвестно, то использование пустой строки для обоих имеет смысл (даже если это означает потерю некоторой информации).

17
ответ дан 3 December 2019 в 07:11
поделиться

Нет, null - очень отличительное значение. Например - только один из более чем дюжины - null может означать «у нас вообще нет значения», а пустая строка означает «у нас есть ответ, а это ничего». Это может быть полезно, например, в качестве ответа на вопрос - ответа так и не было или ответ был ничем ...

Вокруг плавает ВЕЛИКИЙ технический документ, озаглавленный что-то вроде «18 значений NULL» - I не помните, что такое целое число! Во всяком случае, эта статья существует по крайней мере с начала 1990-х годов, и она действительно фантастическая, если вы можете ее найти - я не выполнял поиск в Интернете.

Настоящая проблема с пустыми значениями состоит в том, что они могут «ошибочно» изменять то, какие строки возвращаются. Например, если вы скажете

select strcol1, datecol2, someint3 from fubar where ...

Если strcol1 окажется равным нулю, вы НЕ получите обратно значение для этой строки, потому что подразумевается "где strcol1 не null "- таким образом может отсутствовать вся строка.

Это верно не для всех систем РСУБД, но верно для некоторых в течение довольно долгого времени, поэтому, если вы хотите, чтобы ваш код можно было перемещать из одной РСУБД в другую, вы должны быть ОЧЕНЬ осторожны при работе с нулевыми значениями.

Еще один момент: Oracle - или, по крайней мере, некоторые версии Oracle - будут молча преобразовывать пустые строки в null! Это поистине возмутительно, но каким-то образом у них это было в производстве «навсегда». Осторожно! Мое решение - использовать какую-то другую строку для обозначения «пустой строки», чаще всего с одним пробелом.

0
ответ дан 3 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: