Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];

Вниз

Понятие NULL   Найти похожие ветки 

 
Игорь Шевченко ©   (2006-09-29 14:35) [120]

Тугодум ©   (29.09.06 14:31) [116]
pasha_golub ©   (29.09.06 14:31) [115]

Ну не используйте Оракл, нехай Ларри Элиссон обеднеет :) Так ему, буржую, и надо.


 
MsGuns ©   (2006-09-29 14:50) [121]

NULL - это вообще нечто, своего рода артефакт. Только в отличие от настоящего артефакта, не имеющего объяснимого с т.зр. науки способа происхождения, это артефакт вполне "доморощенный".
Точку зрения Уракла понять можно:
С позиции семантики пустая строка, т.е. "" - то же самое, что и неизвестная, например, дата. Или число (сумма). Именно ТО ЖЕ САМОЕ. Ибо пустой текст совершенно аналогичен его полному отсутствию.
Другое дело, что ни Уракл, ни ИБМ, ни другие "монстеры жанра" не удосужились за полвека (если не больше) собраться вместе за круглым столом (пусть даже уставленным бутылками) и договориться

ЧТО СЧИТАТЬ УНИВЕРСАЛЬНЫМ ПРИЗНАКОМ ОТСТУТСТВИЯ ИНФОРМАЦИИ В БАЗАХ ДАННЫХ ?

Это тем более актуально, если вспомнить физическую сущность технологии хранения информации на "машинных носителях", которая, как известно, не может допустить "полное отсутствие" вообще чего бы то ни было. Ибо есть понятие "Есть сигнал" и есть понятие "Нет сигнала", но нет понятия "а фиг его знает, то ли есть сигнал, то ли его нет".

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

Кстати:
Вот кто мне красиво и убедительно, к примеру, объяснит, к в памяти (например, в объекте типа записи) сохранить отсутствующую дату или число ?
Интим вроде использования признаков или флажков не предлагать.


 
Тугодум ©   (2006-09-29 14:52) [122]

Reindeer Moss Eater ©   (29.09.06 14:33) [118]

Вы, конечно, привыкли, а для меня вот это дико:

Let S = "A              B";
Let S = Replace(S, 1, " ");
Let S = Replace(S, Length(S), " ");
Let S = Trim(S);
// опа, в TrimS уже NULL


k2 ©   (29.09.06 14:35) [119]

Начинаю понимать, почему Oracle называется так, как он называется :)


 
Игорь Шевченко ©   (2006-09-29 14:57) [123]

MsGuns ©   (29.09.06 14:50) [121]


> Другое дело, что ни Уракл, ни ИБМ, ни другие "монстеры жанра"
> не удосужились за полвека (если не больше) собраться вместе
> за круглым столом (пусть даже уставленным бутылками) и договориться
>


У тебя ложные сведения.


 
Reindeer Moss Eater ©   (2006-09-29 15:00) [124]

// опа, в TrimS уже NULL

Дык я не понял, в чем проблема-то?
Результат - строковый тип.
Результат - правильный.
результат можно использовать в опреациях со строками и получить верный результат.

Что здесь такого непривычного?


 
MsGuns ©   (2006-09-29 15:00) [125]

Кстати, в уракловской "странности" интерпретировать NULL строковых доменов как <пусто> видится намного больше суконно-сермяжной правды, чем тупой "пошел на .." скалы или бэйза. В самом деле, только он вернет мне Сидорова Ивана без Отчества в результате простого, как горшок сиквеля Select Fam+" "+Nam+" "+Nam2
Ну НЕИЗВЕСТНО его отчество !
Так что в результате ? Получить ентот самый нул или загромождать запросы инсинуациями типа IIF/CASE ?
Причем в данном контексте, уважаемые коллеги, НИ В КОЕМ СЛУЧАЕ НЕЛЬЗЯ В ОТЧЕСТВО ПИСАТЬ ПУСТО. Потому что есть полные имена без отчеств. ЕСТЬ ! А есть люди с НЕИЗВЕСТНЫМ отчеством. И это суть совершенно разные понятия.


 
Игорь Шевченко ©   (2006-09-29 15:03) [126]

MsGuns ©   (29.09.06 15:00) [125]


> А есть люди с НЕИЗВЕСТНЫМ отчеством.


Это как ? :)


 
Тугодум ©   (2006-09-29 15:03) [127]

Reindeer Moss Eater ©   (29.09.06 15:00) [124]

Для Вас - ничего непривычного.


 
Reindeer Moss Eater ©   (2006-09-29 15:04) [128]

> А есть люди с НЕИЗВЕСТНЫМ отчеством.

Это как ? :)

<Цитата>

Паспорт сжег, и никому не говорит кто-бы ни справшивал.
:)


 
Reindeer Moss Eater ©   (2006-09-29 15:05) [129]

Для Вас - ничего непривычного.

Мне интересно что здесь непривычного для вас.


 
Romkin ©   (2006-09-29 15:05) [130]

Reindeer Moss Eater ©   (29.09.06 15:00) [124] Угу. Взяли строку, отрезали пробелы (или поменяли), и попытались вставить в столбец not NULL. Получили отлуп...
Занятно, а что с char? Там же вроде пробелы всегда должны быть. Если я взял, записал 30 пробелов в char(30), а потом присвоил это varchar(30), что тоже NULL будет?


 
Тугодум ©   (2006-09-29 15:06) [131]

MsGuns ©   (29.09.06 15:00) [125]

Если так хочется обходиться без проверок, ставьте констрейнт NOT NULL. Тем более, раз уж всё равно в поле записываете пустую строку, а не NULL.

Причем в данном контексте, уважаемые коллеги, НИ В КОЕМ СЛУЧАЕ НЕЛЬЗЯ В ОТЧЕСТВО ПИСАТЬ ПУСТО. Потому что есть полные имена без отчеств. ЕСТЬ ! А есть люди с НЕИЗВЕСТНЫМ отчеством. И это суть совершенно разные понятия.

Разные-то они разные, только вот после записи в БД уже невозможно узнать, а что там было. То есть Ваша идея не работает.


 
Reindeer Moss Eater ©   (2006-09-29 15:07) [132]

Угу. Взяли строку, отрезали пробелы (или поменяли), и попытались вставить в столбец not NULL. Получили отлуп...

Отлуп получили правильно.
Если ещ епри этом и уметь ообрабатывать отлупы, то в итоге получим то, чего хотели - в поле будет именно то, чего нам надо было.


 
evvcom ©   (2006-09-29 15:28) [133]

> [38] Внук ©   (29.09.06 09:22)

Ну да, согласен. Оракловая фича. :)

> [40] Sergey13 ©   (29.09.06 09:59)
> Х.З. почему Ораклы так обрабатывают NULL

Имхо, для оптимизации. null физически не хранится.

> [41] Тугодум ©   (29.09.06 10:22)
> Для нарушения стандарта AnsiSQL, чтобы никто с Oracle к
> конкурентам не уходил :)

2 раза ГЫ. :) Они, кстати, и не заявляют, что от стандарта ни на шаг. Так что хозяин-барин. Привычки можно исправить, а жертвовать скоростью, ради стандарта... Вот и забили они здесь на стандарт.

> [42] Sergey13 ©   (29.09.06 10:39)
> ЗЫ: Зато у Оракла есть connect by. 8-)

Эт точно! (с) Сухов

> [43] Тугодум ©   (29.09.06 10:52)
> Oracle заставляет использовать функцию NVL

Мишель, не пори муру (с) песТня

> [45] Reindeer Moss Eater ©   (29.09.06 11:04)

Здесь ты не прав.

> [48] k2 ©   (29.09.06 11:13)

Зачем такой сложный пример? Достаточно
select null || "колобок" || null from dual
получишь колобка

> [49] Тугодум ©   (29.09.06 11:15)

Ты опять не прав.

> [56] Тугодум ©   (29.09.06 11:31)
> Я хочу различать NULL и пустую строку

"Хочу" и "надо" немного разные понятия. :)

> получается, что извращенцы из Oracle

Сам ты извращенец. Напиши свою СУБД. Она, наверное, получится круче. :-)

> [64] Тугодум ©   (29.09.06 11:45)
> Если им нравится отходить от ANSI SQK

А это что за зверь? :-)

> [70] Тугодум ©   (29.09.06 11:55)
> И теперь придется привыкать к тому, что SQL в Oracle не
> такой, как в других СУБД

Ага, а в других СУБД он везде одинаков? Ты их все знаешь? Да ты полиглот! Пойди проспись.

> [80] Игорь Шевченко ©   (29.09.06 12:29)
> Там человек с фамилией ИТОГО больше всех получает

Вот думаю, мож фамилию сменить? :-)
Фу, устал читать...


 
k2 ©   (2006-09-29 15:32) [134]

>Зачем такой сложный пример? Достаточно
select null || "колобок" || null from dual
получишь колобка
угу, а потом вытерпеть холивар откуда и чего берется и кладется в dual :)
тоже фича :)


 
Тугодум ©   (2006-09-29 15:33) [135]

evvcom ©   (29.09.06 15:28) [133]

Хорошо, что ты устал читать.
Да, я полиглот. Я могу работать с любой СУБД, которая поддерживает Ansi SQL. Ну что, начинать перечислять MSSQL, Informix, Paradox, ForPro и прочее, к чему я когда-либо писал запросы?


 
evvcom ©   (2006-09-29 15:43) [136]

> [126] Игорь Шевченко ©   (29.09.06 15:03)

А это, когда даже мама не знает, кто папа. :)

> [125] MsGuns ©   (29.09.06 15:00)

Ну так ты в этом посте "за" или "против"? Я что-то не понял... :)
Да и какая собственно разница в двух записях:
Иванов Иван
Абдурахман ибн Ямин Папуас Оглы
пустое там отчество или неизвестное?

> [130] Romkin ©   (29.09.06 15:05)

пробел это не null, вот если TRIM(" "), тогда null


 
evvcom ©   (2006-09-29 15:57) [137]

> [134] k2 ©   (29.09.06 15:32)

Уже давно перешли на оракла, потому каждый мал мальски знакомый с ним должен знать про dual :)

> [135] Тугодум ©   (29.09.06 15:33)
> Я могу работать с любой СУБД, которая поддерживает Ansi SQL

Качественная и эффективная работа с СУБД не ограничивается умением писать только селекты и апдейты.


 
k2 ©   (2006-09-29 16:02) [138]

evvcom ©   (29.09.06 15:57) [137]
хорошо, обещаю больше никаких сложных примеров :)


 
wal ©   (2006-09-29 16:07) [139]


> [137] evvcom ©   (29.09.06 15:57)
> Уже давно перешли на оракла, потому каждый мал мальски знакомый
> с ним должен знать про dual :)
А в форуме сидят исключительно те, кто ... (см. выше)


 
pasha_golub ©   (2006-09-29 16:34) [140]

A dual по-моему даже в стандартах употребляется? Нет? Я где-то встречал, только вот фиг вспомню где.


 
MsGuns ©   (2006-09-29 17:38) [141]

>evvcom ©   (29.09.06 15:43) [136]
>Ну так ты в этом посте "за" или "против"? Я что-то не понял... :)

Я как большинство !  ;))
А если серьезно, то в данном контексте (интерпретации нула для строковіх колонок как "пусто") я - за уракл. А вообще против. Как баба Яга ;))


 
kaif ©   (2006-09-29 17:58) [142]

2 MsGuns ©   (29.09.06 15:00) [125]

Мне вполне понятна точка зрения ORACLE считать отсутствие текста неопределенным текстом.
Это действительно иногда удобно.

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


 
kaif ©   (2006-09-29 18:00) [143]

Если строка из трех пробелов несет информацию "здесь 3 символа", то пустая строка несет информацию "здесь 0 символов". А Null - когда строка не несет вообще никакой информации.


 
kaif ©   (2006-09-29 18:07) [144]

Лучше вместо "несет" употребить слово "содержит".

Итак, пустая строка (ИМХО) философски содержит информацию о том, что в строке имеется 0 символов.
А строка со значением NULL не содержит никакой информации.

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

А удобно многое...

Например кому-то удобно, что в интерпретаторах переменные не имеют типизации. Зато потом кто-то, возможно, потерял целый день на поиск неожиданно вылезшего бага, хотя 10 лет все "работало как часы".

А говорить, что каждый раз возиться с NULL в лом - то же самое, как говорить, что каждый раз объявлять переменные в типизированных языках кому-то в лом. Мне - не в лом, например.


 
Внук ©   (2006-09-29 18:27) [145]

>>kaif ©
 Согласен


 
Reindeer Moss Eater ©   (2006-09-29 22:05) [146]

Ну а как насчет прикола с передачей этого значения в носитель?


 
DiamondShark ©   (2006-09-30 10:53) [147]


> Reindeer Moss Eater ©   (29.09.06 13:33) [100]
> Цифры то здесь при чем?

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


> Reindeer Moss Eater ©   (29.09.06 22:05) [146]
> Ну а как насчет прикола с передачей этого значения в носитель?

Точно так же, как с числом 1.
Можно записать один бит, можно -- сорок байт. И всё это будет представлением числа 1 в какой-то конкретной физической реализации.

Если до тебя разница между абстракцией "число" (строка, множество, итп итд) и физ. представлением не доходит -- убей себя ап стену.
Ну или хотя бы к компу больше не подходи.


 
euru ©   (2006-09-30 11:29) [148]


> Reindeer Moss Eater ©   (29.09.06 22:05) [146]
> Ну а как насчет прикола с передачей этого значения в носитель?
http://www.mysql.ru/docs/man/Problems_with_NULL.html:

Концепция NULL-значения часто вводит в заблуждение новичков в SQL, которые считают, что NULL - то же, что и пустая строка "". Это ошибка! Например, следующие команды совершенно различны:

mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ("");

Обе команды вставляют значение в столбец phone, но первая - значение NULL, а вторая - пустую строку. Смысл первого можно передать как "номер телефона неизвестен"", смысл второго - "у нее нет телефона"".

При чтении данных с помощью LOAD DATA INFILE пустые поля обновляются значениями "". Если необходимо поместить в столбец значение NULL, то в текстовом файле следует использовать \N. Также при некоторых обстоятельствах можно использовать слово-литерал NULL (see section 6.4.9 Синтаксис оператора LOAD DATA INFILE).


 
Reindeer Moss Eater ©   (2006-09-30 13:33) [149]

DiamondShark ©  

Ну и при чем здесь извращенная физическая реализация?
Неужели так трудно понять о чем я?

Есть строковый тип и у него есть уже физическая реализация.
Мне говорят, что пустая строка - это такое же полноценное значение строкового типа как и любое другое.
Я говорю, замечательно!
Как мне передать это полноценное значение по медиа?
Все молчат или придумывают новую физическую реализацию для этого значения.

А я утверждаю, что это значение и есть полный эквивалент NULL!
То есть нет никакого значения или значение не определено!

Если оно есть, передайте его в сообщении. Причем так, что бы можно было с определенностью сказать есть там ваша пустая строка или нет. И если есть, то сколько именно.

Если это такое же равноправное значение типа как и все остальные строки.


 
Danilka ©   (2006-10-02 08:32) [150]

[148] euru ©   (30.09.06 11:29)
Глупости!
Это у кого, в наше время, нет телефона, а?
:)


 
Sergey13 ©   (2006-10-02 09:02) [151]

Почему то никого не возмущает тот факт, что все СУБД отбрасывают хвостовые пробелы в varchar-е. Ведь номинально есть разница между "строка" и "строка       ". Однако если отбросить "строка" сразу возникают непримиримые противоречия. 8-)
ЗЫ: А для любителей "точности" есть CHAR. 8-)


 
evvcom ©   (2006-10-02 09:40) [152]

> [148] euru ©   (30.09.06 11:29)
> Смысл первого можно передать как "номер телефона неизвестен"",
> смысл второго - "у нее нет телефона"".

Тогда первое надо поделить еще на 2:
1. телефон есть, но неизвестен
2. неизвестно вообще, есть ли телефон, и сколько их.
:-)
Если нужны (ну просто жить без них кто-то не может) подобные флаги/понятия, можно явно ввести поле для такого флага.
Еще, если точно известно, что телефона нет, достаточно (и вроде обычно так и делают) поставить прочерк "-". Оно и на печати будет различимо. А различимые в sql null и "" (не Оракл) на печати один фиг не различишь. Да и в компонентах ввода, DBEdit к примеру, как их различить?


 
euru ©   (2006-10-02 10:09) [153]


> Reindeer Moss Eater ©   (30.09.06 13:33) [149]
>Если оно есть, передайте его в сообщении. Причем так, что бы можно
> было с определенностью сказать есть там ваша пустая строка
> или нет. И если есть, то сколько именно.

А как в Вашем случае передаётся пустая строка? Мне известно два варианта:
1. Передать в строке некий символ, информирующий, что это пустая строка. Чаще всего в качестве такого символа используется символ 0x00. Хотя, в принципе, ничто не мешает вместо него использовать какой-либо другой символ или даже их комбинацию. Но, согласитесь, пустая строка, содержащая символ (хотя бы один) уже не является пустой строкой.
2. Передать дополнительную информацию, сообщающую, что в строке нет символов. Чаще всего в качестве такой информации используется длина передаваемой строки, хотя можно использовать, например, некий флаг, сообщающий, что строка пустая. В данном варианте физическая реализация передаёт вообще не строку, а информацию о ней.

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

Так почему если для передачи пустых строк используется дополнительная информация, то таким же способом нельзя передать NULL?


 
euru ©   (2006-10-02 10:24) [154]


> Danilka ©   (02.10.06 08:32) [150]
> [148] euru ©   (30.09.06 11:29)Глупости!Это у кого, в наше
> время, нет телефона, а?:)

Наверно, в то время когда писалась эта документация, такая ситуация была распространённой. Можно предложить авторам обновить документацию с учётом современных реалий. Например, вместо "номера телефона" использовать "серийный номер автомата Калашникова". Думаю, ещё не скоро наступят времена, когда у всех в качестве обязательного аксессуара будет сей предмет. :)


> evvcom ©   (02.10.06 09:40) [152]
> Еще, если точно известно, что телефона
> нет, достаточно (и вроде обычно так и делают) поставить
> прочерк "-". Оно и на печати будет различимо.

Ага, в поле типа NUMERIC вписать "-".


> А различимые в sql null и "" (не Оракл) на печати один фиг не различишь.
>  Да и в компонентах ввода, DBEdit к примеру, как их различить?

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


 
evvcom ©   (2006-10-02 10:42) [155]

> [154] euru ©   (02.10.06 10:24)
> Ага, в поле типа NUMERIC вписать "-".

Речь идет о varchar/varchar2

> А собственно NULL не для того вводили, чтобы его правильно
> на печати или в компонентах ввода различать

Угу, догадываюсь. :) Речь не о том.


 
Danilka ©   (2006-10-02 10:46) [156]

[154] euru ©   (02.10.06 10:24)
В поле для ввода серийника АК писать: "оказываецца сообщать!", все равно поле текстовое. :)
А если нумерик, то у Оракла нулл в таких полях ничем не отличается от других СУБД. :)


 
Игорь Шевченко ©   (2006-10-02 10:50) [157]

Смех смехом, но мне за все время программирования с использованием СУБД не приходилось сталкиваться с задачами, где естественным образом требуется отличать NULL от пустой строки, кроме искусственных приемов, которые обычно были трудно сопровождабельны. Я 23 года жил не так ?


 
Sergey13 ©   (2006-10-02 10:58) [158]

> [157] Игорь Шевченко ©   (02.10.06 10:50)

Ага, теперь тебе будет стыдно за "бесцельно прожитые годы". 8-)

А если серьезно, то проблема как раз наоборот, скорее есть тогда когда "" и NULL различны, ибо надо всегда делать 2 проверки вместо одной.


 
ANB ©   (2006-10-02 10:59) [159]


> с использованием СУБД не приходилось сталкиваться с задачами,
>  где естественным образом требуется отличать NULL от пустой
> строки

Эхм. После оракла в FB я с такой проблемой столкнулся. А NVL в FB нету. :(


> что все СУБД отбрасывают хвостовые пробелы в varchar-е

Странно. А оракл не отбрасывает. Может он не СУБД ?


 
pasha_golub ©   (2006-10-02 11:01) [160]


> Игорь Шевченко ©   (02.10.06 10:50) [157]
>


Не знаю есть ли такое в Оракле, но уверен, что есть. Пример из PostgreSQL:

Создаем Foreign Key по нескольким колонкам и указываем, допустим MATCH SIMPLE:


FOREIGN KEY ( column1 [, ... ] ) REFERENCES reftable [ ( refcolumn1 [, ... ] ) MATCH SIMPLE


В этом случае "MATCH SIMPLE allows some foreign key columns to be null while other parts of the foreign key are not null".

Однако, пустую строку сюда уже никаким образом не впихнуть.



Страницы: 1 2 3 4 5 6 7 8 9 
10 вся ветка

Форум: "Прочее";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.84 MB
Время: 0.078 c
2-1159973084
Виталий Гаврилов
2006-10-04 18:44
2006.10.29
Как применить XML в работе приложения


2-1160394334
NetRaven
2006-10-09 15:45
2006.10.29
StringGrid


15-1160474069
Vlad Oshin
2006-10-10 13:54
2006.10.29
Про отца. Мини-рассказ


2-1160558670
novill
2006-10-11 13:24
2006.10.29
Как из PWideChar получить Ansistring или Shortstring


6-1149315294
wsxedc
2006-06-03 10:14
2006.10.29
Как передавать из программы параметры методами GET/POST?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский