2014-11-10 1 views
0

Справочной информации: (! Да, я меняю его)Null столбца с неопределенными значениями

Я имею дело с базой данных устаревшего SQL Server 2000. Он имеет столбец, который мы можем назвать именем, которое является nvarchar (100), а не null. Я проверил это.

Когда я запускаю этот запрос:

select name 
from mytable 
where name is null 

я не получаю никаких результатов. Однако, когда я запускаю этот запрос:

select name 
from mytable 
where name = '' 

Я получаю около 100 результатов. Я хотел бы узнать немного больше об этих пустых значениях, так как пространства будут законными в не столбце нулевого, так что я выполнил этот запрос:

select ASCII(substring(name, 1, 1)) 
from s 
where name = '' 

Это возвращает «32» около трети результатов, т.е. пространство. Однако для других 2/3rds он возвращает null.

Вопрос:

  1. Как может быть нулевые значения в столбце, который имеет не нулевое определение?
  2. Почему эти нулевые значения не отображаются в запросе «name is null»?
+0

У вас нет значений «NULL», вы сказали, что сами, верно ?. – Lamak

+0

Я бы предположил, что значение символа '\ 0' интерпретируется как 'NULL'. Я считаю, что его официальное название - «NUL». –

+0

Вам нужно понять, что 'ASCII (substring (name, 1, 1))' возвращает вас NULL', не означает, что 'name' имеет значение null – Lamak

ответ

3

У вас нет NULL в столбце name, вы подтвердили это своим первым запросом.

Условие name = '' соответствует как пустым строкам, так и строкам пробелов.

Когда name пуст, SUBSTRING(name, 1, 1) также пуст, и аргумент ASCII. В этом случае ASCII возвращает NULL. Когда name представляет собой строку пробелов, аргумент, предоставленный в ASCII, является пространством, поэтому результатом является 32, код ASCII символа пробела.

+0

Понял. Спасибо, это делает вещи намного яснее. –