SQL Server 2008 - Значение столбца по умолчанию - я должен использовать пустую или пустую строку? - PullRequest
4 голосов
/ 03 февраля 2010

В течение некоторого времени я спорю, стоит ли мне оставлять столбцы, которые я не знаю, будут ли переданы данные, и установить значение в пустую строку ('') или просто разрешить ноль.

Я хотел бы услышать, что здесь рекомендуется.

если это имеет значение, я использую c # в качестве приложения-потребителя.

Ответы [ 5 ]

7 голосов
/ 03 февраля 2010

Боюсь, что ...

это зависит!

На этот вопрос нет однозначного ответа.

Как указано в других ответах, на уровне SQL , NULL и пустая строка имеют очень разную семантику , первая указывает на то, что значение неизвестно, последняя указывает на то, что значение - это «невидимая вещь» (на экранах и в отчете), но тем не менее это «известное значение». Примером, обычно приводимым в этом контексте, является отчество. Нулевое значение в столбце «middle_name» будет означать, что мы не знаем, имеет ли основной человек отчество или нет, и если да, то каково это имя, пустая строка будет означать, что мы «знаем», что этот человек делает не имеет отчество.

При этом два других вида факторов могут помочь вам выбрать один из этих вариантов для данного столбца.

  • Сама семантика базовых данных на уровне приложения.
  • Некоторые соображения относительно работы SQL с нулевыми значениями

Семантика данных
Например, важно знать, является ли пустая строка допустимым значением для базовых данных. Если это так, мы можем потерять информацию, если мы также используем пустую строку для «неизвестной информации». Другое соображение заключается в том, можно ли использовать какое-то альтернативное значение в случае, когда у нас нет информации для столбца; Возможно, 'n / a' или 'unspecified' или 'tbd' являются лучшими значениями.

Поведение SQL и утилиты
Учитывая поведение SQL, выбор использования или отсутствия использования NULL может быть обусловлен соображениями пространства, желанием создать фильтрованный индекс или удобством функции COALESCE () (которую можно эмулировать с помощью операторов CASE, но более многословно). Другое соображение заключается в том, может ли какой-либо запрос пытаться запросить несколько столбцов для добавления их (как в SELECT name + ',' + middle_name AS LongName и т. Д.).

Помимо обоснованности выбора NULL или пустой строки, в данной ситуации общее соображение состоит в том, чтобы попытаться быть максимально последовательным, т. Е. Пытаться придерживаться ОДНОГО конкретного способа и только / преднамеренно / явно отступать от этого пути по уважительным причинам и в некоторых случаях.

3 голосов
/ 03 февраля 2010

NULL означает неизвестное значение. Пустая строка означает известное значение - строку с нулевой длиной. Это совершенно разные вещи.

3 голосов
/ 03 февраля 2010

Не используйте пустую строку, если нет значения. Если вам нужно знать, неизвестно ли значение, установите для него флаг. Но 9 раз из 10, если информация не предоставлена, она неизвестна, и это нормально.

1 голос
/ 03 февраля 2010

Теория в стороне, я склонен рассматривать:

  • Пустая строка как известное значение
  • NULL как неизвестно

В этом случае я 'вероятно, будет использоваться NULL.

Важно соблюдать согласованность: смешивание NULL и пустых строк приведет к разрыву.

На практическом уровне реализации пустая строка занимает 2 байта в SQL Server, гдекак NULL растровые.В некоторых условиях и для больших / больших таблиц производительность меняется, потому что требуется больше данных для перемещения.

1 голос
/ 03 февраля 2010

пусто, когда я хочу допустимое значение по умолчанию, которое может или не может быть изменено, например, отчество пользователя.

NULL, если это ошибка, если следующий код не устанавливает значение явно.

Однако, инициализируя строки с пустым значением вместо нуля, вы можете уменьшить вероятность возникновения исключения NullReferenceException.

...