Подтвердить что ты не робот

SQL Server: Null VS Empty String

Как хранятся значения NULL и Empty Varchar в SQL Server. И в случае, если у меня нет пользовательской записи для поля string в моем пользовательском интерфейсе, должен ли я хранить NULL или ''?

4b9b3361

Ответ 1

Там хорошая статья здесь, которая обсуждает этот вопрос. Ключевым моментом, который необходимо уловить, является отсутствие разницы в размере таблицы, однако некоторые пользователи предпочитают использовать пустую строку, так как это может упростить запросы, поскольку нет проверки NULL. Вы просто проверяете, является ли строка пустой. Следует также отметить, что NULL означает в контексте реляционной базы данных. Это означает, что указатель на символьное поле установлен в 0x00 в заголовке строки, поэтому нет доступа к данным.

Обновление Там подробно статья здесь, которая говорит о том, что на самом деле происходит на основе ряда

Каждая строка имеет нулевое растровое изображение для столбцов, которые допускают нулевые значения. Если строка в этом столбце равна нулю, то бит в битовой карте равен 1, иначе это 0.

Для типов данных переменного размера фактический размер составляет 0 байтов.

Для типа данных фиксированного размера действительный размер - это размер типа данных по умолчанию в байтах, установленный в значение по умолчанию (0 для чисел, '' для символов).

результат DBCC PAGE показывает, что как пустые, так и пустые строки занимают нулевые байты.

Ответ 2

Будьте осторожны с нулями и проверкой на неравенство в sql-сервере.

Например

select * from foo where bla <> 'something' 

НЕ будет возвращать записи, где bla равно null. Хотя логически это должно быть.

Таким образом, правильный способ проверки будет

select * from foo where isnull(bla,'') <> 'something' 

Который, конечно, люди часто забывают, а затем получают странные ошибки.

Ответ 3

Пустая строка - это строка с нулевой длиной или без символа. Null - отсутствие данных.

Ответ 4

Концептуальные различия между NULL и "пустой строкой" являются реальными и очень важными в дизайне базы данных, но часто неправильно понимаются и ненадлежащим образом применяются - здесь краткое описание двух:

NULL - означает, что мы НЕ знаем, что такое значение, оно может существовать, но оно может не существовать, мы просто не знаем.

Empty-String - означает, что мы знаем, что такое значение и что оно ничего.

Вот простой пример: Предположим, у вас есть таблица с именами людей, включая отдельные столбцы для first_name, middle_name и last_name. В сценарии, где first_name = 'John', last_name = 'Doe' и middle_name IS NULL, это означает, что мы не знаем, что такое среднее имя, или даже оно существует. Измените этот сценарий таким образом, чтобы middle_name = '' (т.е. Пустая строка), и теперь это означает, что мы знаем, что нет среднего имени.

Я однажды услышал, как инструктор SQL Server продвигает создание каждого столбца типа символов в требуемой базе данных, а затем присваивает значение DEFAULT VALUE каждому из "(пустая строка)" или "unknown". Указав это, преподаватель продемонстрировал, что у него не было четкого понимания разницы между NULL и пустыми строками. По общему признанию, различия могут показаться запутанными, но для меня приведенный выше пример помогает прояснить разницу. Кроме того, важно понимать разницу при написании кода SQL и правильно обрабатывать NULL, а также пустые строки.

Ответ 5

Значения NULL хранятся отдельно в специальном растровом пространстве для всех столбцов.

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

Ответ 6

NULL является не значением, например undefined. '' - пустая строка с 0 символами.
Значение строки в базе данных зависит от вашего значения в пользовательском интерфейсе, но обычно это пустая строка '', если вы укажете параметр в своем запросе или хранимую процедуру.

Ответ 7

если это не поле внешнего ключа, не используя пустые строки, может сэкономить вам некоторую проблему. допускают только null, если вы примете значение null, чтобы означать нечто отличное от пустой строки. например, если у вас есть поле пароля, нулевое значение может указывать на то, что новый пользователь еще не создал свой пароль, а пустой varchar может указывать пустой пароль. для поля типа "address2", допускающего нулевое значение, может только усложнить жизнь. вещи, на которые следует обратить внимание, включают в себя нулевые ссылки и неожиданные результаты операторов = и < > , упомянутых Вагифом Верди, и наблюдение за этими вещами часто являются ненужными накладными программистами.

edit: если производительность проблемы, см. этот связанный вопрос: Нулевые или ненулевые типы данных varchar - что быстрее для запросов?

Ответ 8

Как хранятся значения "NULL" и "empty varchar", хранящиеся в SQL Server. Зачем вам это знать? Или, другими словами, если бы вы знали ответ, как бы вы использовали эту информацию?

А если у меня нет пользовательской записи для поля строки в моем пользовательском интерфейсе, я должен хранить NULL или ''? Это зависит от характера вашей области. Спросите себя, является ли пустая строка допустимым значением для вашего поля.

Если это (например, имя дома в адресе), то это может быть то, что вы хотите сохранить (в зависимости от того, знаете ли вы, что адрес не имеет имени дома).

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