powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Ловушка 22
25 сообщений из 170, страница 5 из 7
Ловушка 22
    #34258512
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FrankieОтсутствие значения есть суть null.
Тогда пустая строка вполне укладывается в эту суть :)

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

В принципе может случиться так, что в типе данных уже есть подобный спецсимвол, значение, играющее подобную же роль. В таком случае наличие различных между собой "sql-ного null" и "внутритипового спецсимвола с тем же смыслом" создает значительные неудобства, и будет вполне логично их отождествить. Авторы стандарта не предусмотрели этого момента, это их недочет.

FrankieКонечно, реализация языка часто приписывает это значение, когда переменная определяется, но в большинстве случаев это и есть null / nil.
Хм. Поймите: sql-ный null, паскалевский nil, дельфовый null, сишный NULL - это не то чтобы все совсем одно и то же. Это разные вещи, не стоит их безоговорочно смешивать.

FrankieИнтересно как на этот счёт ведут себя другие языки...
Ява - если не изменяет память, аналогично. В сях и сипласпласах нет стандартного класса строки, зависит от реализации. Там, где используется PChar или char*, в принципе зависит от реализации, от того, как обрабатывается этот момент. Скажем, большинство функций WinAPI понимают nil как пустую строку, но есть исключения, некоторые падают.
...
Рейтинг: 0 / 0
Ловушка 22
    #34258742
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer FrankieОтсутствие значения есть суть null.
Тогда пустая строка вполне укладывается в эту суть :)
Но в эту суть вполне не укладываются ваши рассуждения о неком спецсимволе null.

softwarerЕсли мне не изменяет память, стандарт определяет null как "значение, отличное от любого другого", попросту расширяет алфавит неким спецсимволом и дает ему специфическую роль.
Ловко вы, однако, приравняли "значение" и "спецсимвол"! Конечно, подобная трактовка может быть реализована, но думается, что на деле нету никакого символа, а есть просто нулевой указатель (в никуда).

softwarerВ принципе может случиться так, что в типе данных уже есть подобный спецсимвол, значение, играющее подобную же роль. В таком случае наличие различных между собой "sql-ного null" и "внутритипового спецсимвола с тем же смыслом" создает значительные неудобства, и будет вполне логично их отождествить. Авторы стандарта не предусмотрели этого момента, это их недочет.
Интересно какие? Вроде как при перетаскивании информации на клиент типы данных из запроса приводятся в наиболее близкие клиентские. Так что на sql-null приложению плевать. Отождествить? Не согласен. В БД null это пустая ячейка, в программировании - указатель в никуда. Память программы - не база данных, всё ж.

softwarerХм. Поймите: sql-ный null, паскалевский nil, дельфовый null, сишный NULL - это не то чтобы все совсем одно и то же. Это разные вещи, не стоит их безоговорочно смешивать.
С sqlным конечно. А в остальном так не вижу особой разницы (наверняка она есть для низкоуровневых программ), гораздо важнее как ведут себя с нуллом операторы.
...
Рейтинг: 0 / 0
Ловушка 22
    #34258798
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пару слов по теме: какая-то у автора странная nullофобия. Блин, ну раз в любой СУБД эта вещь есть и есть немало средств по работе с ним, то зачем-то она нужна? Так изучите и пользуйтесь!
...
Рейтинг: 0 / 0
Ловушка 22
    #34259291
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL и NULL: Можно обойтись без NULL в исходных таблицах (только много их будет), но без NULL невозможен Outer Join, что уж совсем скучно.
Ну а если NULL все равно пролез, так почему бы не использовать и в таблицах - будет их поменьше. Так что
Frankieизучите и пользуйтесь!
+1
...
Рейтинг: 0 / 0
Ловушка 22
    #34259366
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRно без NULL невозможен Outer Join
Это ошибочное утверждение.
...
Рейтинг: 0 / 0
Ловушка 22
    #34259775
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FrankieЛовко вы, однако, приравняли "значение" и "спецсимвол"!
Хм. Если посмотрите книги по алгоритмам и более-менее формальным аспектам программирования, начиная от машины Тьюринга, обнаружите частно используемый прием: говорят об алфавите (например, возможных составляющих входных данных) и расширяют его некоторыми специально обозначенными символами, играющими роль маркеров итп. Это позволяет удобно и наглядно излагать теоретические выкладки, не перегружая их очевидными, но объемными техническими деталями. Спецсимвол здесь - именно в этом смысле, ничего особо ловкого, признаться, не вижу.

FrankieКонечно, подобная трактовка может быть реализована, но думается, что на деле нету никакого символа, а есть просто нулевой указатель (в никуда).
Нулевой указатель и указатель в никуда - разные вещи. То, что в частном случае второе реализуется первым - это именно что частный случай, полагаться на который не рекомендуется.

Далее, тот же sql-ный null определенно не является "нулевым указателем".

Наконец, различайте символ (null) и его реализацию. null, равно как и nil - это не просто значение, это ключевые слова языка (sql и pascal соответственно). Это обозначение некоего специального понятия, спецсимвол.

FrankieИнтересно какие? Вроде как при перетаскивании информации на клиент
А при чем тут вообще клиент? Клиент - это отдельная песня.

Какие - неопределенность. Скажем, представьте себе, что в том же MSSQL Вам поставлена задача: написать ХП, которая не даст вводить в базу, например, пустые пароли. Сразу встает вопрос: как именно написать условие?

password <> '' ?

password is not null ?

( password <> '' ) and ( password is not null ) ?

length ( password ) > 0 ?

any other idea?

Для того, чтобы такого вопроса не возникало, придется принимать дополнительное соглашение, скажем считать, что для строковых полей пустота - это пустая строка, а null - "логический парадокс", которого в поле никогда не должно быть, иначе обрушится вся бизнес-логика.
...
Рейтинг: 0 / 0
Ловушка 22
    #34260187
softwarer FrankieОтсутствие значения есть суть null.
Тогда пустая строка вполне укладывается в эту суть :)



Извиняюсь, что встреваю в вашу задушевную беседу :)
но null это всет таки неопределенное значение, а пустая строка это конкретно пустая строка. Сумма двух пустых строк даст пустую строку, а сумма null и пустой строки даст null, т.е неопределенное значение, что вполне естественно.
Именно поэтому не может в уникальный ключ входить более двух значений null, потому что среди двух неопределенных значений могут попасться и два одинаковых
...
Рейтинг: 0 / 0
Ловушка 22
    #34260261
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ФедоренкоИменно поэтому не может в уникальный ключ входить более двух значений null, потому что среди двух неопределенных значений могут попасться и два одинаковыхЕсли интерпретировать null как пустую строку, то с выводами можно было бы согласиться. В случае же понимания null именно как неопределенной величины, то, по стандарту ANSI, один null не равен другому и соответственно ограничение вида UNIQUE должно позволять любое множество таких значений. И с этой точки зрения MSSQL, например, нарушает данное требование стандарта, пусть даже такое ограничение и возможно сэмулировать.
Кстати, softwarer, не просветите, как поведет себя Oracle, если наложить на поле строкового типа ограничения UNIQUE, а затем добавить 2 записи со значением NULL в этом поле. Как он будет их интепретировать, как 2 NULL-а, и разрешит, или как 2 пустых строки - и не разрешит ?
...
Рейтинг: 0 / 0
Ловушка 22
    #34260263
ChA Александр ФедоренкоИменно поэтому не может в уникальный ключ входить более двух значений null, потому что среди двух неопределенных значений могут попасться и два одинаковыхЕсли интерпретировать null как пустую строку, то с выводами можно было бы согласиться. В случае же понимания null именно как неопределенной величины, то, по стандарту ANSI, один null не равен другому

Эта не вся правда. Другая правда это то, что условие один null не равен другому тоже фальш - любое сравнение с null дает фальш. Потому как значение не определено. В этом-то и логическая тонкость null. Но на этом вся его тонкость и заканчивается.
...
Рейтинг: 0 / 0
Ловушка 22
    #34260264
ChAКстати, softwarer, не просветите, как поведет себя Oracle, если наложить на поле строкового типа ограничения UNIQUE, а затем добавить 2 записи со значением NULL в этом поле. Как он будет их интепретировать, как 2 NULL-а, и разрешит, или как 2 пустых строки - и не разрешит ?

Inormix интерпретирует естественно как null и естественно второе значение запрещает.
...
Рейтинг: 0 / 0
Ловушка 22
    #34260278
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Федоренкоусловие один null не равен другому тоже фальш - любое сравнение с null дает фальш.Не совсем так, с появлением null логика становится трехзначной SQL2003a) If either XV or YV is the null value, then
X <comp op> Y
is Unknown . Думаю согласитесь, что Unknown и False - вещи немного разные ?
...
Рейтинг: 0 / 0
Ловушка 22
    #34260717
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Чиатл в какой-то книге по основам программирования, что компьютерная логика на самом деле и есть трёхначная - false, true и null. Но фокус в том, что null, как верно нас одёрнули ниже - это не символ - это именно неопределённое значение и, конечно же, двух одинаковых null не бывает. Именно потому, что значение неопределено, а компьютер "палить наугад" права не имеет, пусть надо "угадать" из всего из двух.

softwarerНулевой указатель и указатель в никуда - разные вещи. То, что в частном случае второе реализуется первым - это именно что частный случай, полагаться на который не рекомендуется. Далее, тот же sql-ный null определенно не является "нулевым указателем".

Согласен со всем, погорячился :/

softwarer FrankieИнтересно какие? Вроде как при перетаскивании информации на клиент А при чем тут вообще клиент? Клиент - это отдельная песня.
Вы же практик? Так на практике важно, как клиент обработает поступивший от сервера NULL.

softwarer
Скажем, представьте себе, что в том же MSSQL Вам поставлена задача: написать ХП, которая не даст вводить в базу, например, пустые пароли. Сразу встает вопрос: как именно написать условие?
password <> '' ?

password is not null ?
( password <> '' ) and ( password is not null ) ?

length ( password ) > 0 ?

any other idea?

Могу обосновать, если хотите...

Отдельное спасибо вступившимся участникам дискуссии, очень интересно )))
...
Рейтинг: 0 / 0
Ловушка 22
    #34260753
Sgt.Pepper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer FrankieОтсутствие значения есть суть null.
Тогда пустая строка вполне укладывается в эту суть :)

Простите, но почему бы используя Вашу логику не пойти дальше и в интовом атрибуте не убрать различия между null и нулем? ;)
...
Рейтинг: 0 / 0
Ловушка 22
    #34260916
ChA Александр Федоренкоусловие один null не равен другому тоже фальш - любое сравнение с null дает фальш.Не совсем так, с появлением null логика становится трехзначной SQL2003a) If either XV or YV is the null value, then
X <comp op> Y
is Unknown . Думаю согласитесь, что Unknown и False - вещи немного разные ?
Разговор не шел про is null. С ним как раз все понятно: либо нал либо не нал :)

Я как раз про ваш вывод "один null не равен другому и соответственно ограничение вида UNIQUE должно позволять любое множество таких значений". Он неверен, потому что основан только на одной половинке правды. Вернее "один null не равен другому" как раз и не правда :)
X = NULL;
Y = NULL;
Z = 0;
IF X <> Y THEN Z = 1;

Значение Z останется 0.
...
Рейтинг: 0 / 0
Ловушка 22
    #34260977
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ФедоренкоОн неверен, потому что основан только на одной половинке правды. Вернее "один null не равен другому" как раз и не правда :)
X = NULL;
Y = NULL;
Z = 0;
IF X <> Y THEN Z = 1;

Значение Z останется 0.
Занятно

Но:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare @a int;
declare @b int;

set @a = null;
set @b = null;

if @a <> @b set @a =  1 
select @a

if @a = @b set @a =  1 
select @a
В обеих случаях @a - NULL. А всё потому, что NULL это неопределённое значение, а значит никаких логических выводов на его основе делать невозможно, кроме is (not) null.
...
Рейтинг: 0 / 0
Ловушка 22
    #34260998
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Васкецов ModelRно без NULL невозможен Outer Join
Это ошибочное утверждение.Плз подробнее.
XAB1p
YAC2q
Select X.*, Y.C from X left join Y on X.A=Y.A
JoinABC1p ??
...
Рейтинг: 0 / 0
Ловушка 22
    #34261070
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Федоренко Он неверен, потому что основан только на одной половинке правды. Вернее "один null не равен другому" как раз и не правда :)
X = NULL;
Y = NULL;
Z = 0;
IF X <> Y THEN Z = 1;

Значение Z останется 0.
Правда.
IF X <> Y or not (X <> Y) or X=Y or not (X=Y ) THEN Z = 1;
Значение Z все равно останется 0, ибо все эти сранения не дадут ни ЛОЖЬ ни ИСТИНА, а лишь
х.е.з.

Но не всегда правда.
GROUP BY исправно все NULL сгруппирует в единственную строчку.
в ORACLE Decode(NULL, NULL, 1, 0) будет 1 - успешно сравнилось.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261184
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Федоренконо null это всет таки неопределенное значение,
Есть и такая трактовка. Но с логической точки зрения она далеко не всегда удобна; скажем, она вполне оправдывает nullофобию топикстартера (согласитесь, "цена не задана" - вполне нормальная составляющая бизнес-модели, а вот "цена есть, но неопределенна" - мягко говоря, нелогично).

Александр ФедоренкоСумма двух пустых строк даст пустую строку, а сумма null и пустой строки даст null, т.е неопределенное значение, что вполне естественно.
Это может быть и "естественно", хотя я с этим не соглашусь, но не удобно.

Александр ФедоренкоИменно поэтому не может в уникальный ключ входить более двух значений null
1. Кто сказал, что не могут?
2. А почему именно более двух, а не более одного или более трех?
...
Рейтинг: 0 / 0
Ловушка 22
    #34261205
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChAКстати, softwarer, не просветите, как поведет себя Oracle, если наложить на поле строкового типа ограничения UNIQUE, а затем добавить 2 записи со значением NULL в этом поле. Как он будет их интепретировать, как 2 NULL-а, и разрешит, или как 2 пустых строки - и не разрешит ?
Разрешит.

Александр Федоренколюбое сравнение с null дает фальш.
Это неправда, причем заведомая неправда, противоречащая стандарту.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> declare
   2     b boolean ;
   3   begin
   4     b := ( null = null ) ;
   5     if b then
   6       dbms_output.put_line ( 'true' ) ;
   7     elsif not b then
   8       dbms_output.put_line ( 'false' ) ;
   9     else
  10       dbms_output.put_line ( 'not true but not false also' ) ;
  11     end if ;
  12   end ;
  13   /

not true but not false also

PL/SQL procedure successfully completed
...
Рейтинг: 0 / 0
Ловушка 22
    #34261220
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sgt.PepperПростите, но почему бы используя Вашу логику не пойти дальше и в интовом атрибуте не убрать различия между null и нулем? ;)
Потому что для нуля в обычном его смысле - поле вещественных чисел и все такое - не выполняется сказанное мной требование "уже есть подобный спецсимвол, значение, играющее подобную же роль". Ноль не играет подобной роли, соответственно притягивание его к null-у будет неудобным.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261261
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ФедоренкоInormix интерпретирует естественно как null и естественно второе значение запрещает.
Значит, Informix, как и MSSQL, нарушает в этом месте стандарт ANSI. Спасибо, будет лишняя информация к очередному разговору с любителями действовать "строго по стандарту".

FrankieЧиатл в какой-то книге по основам программирования, что компьютерная логика на самом деле и есть трёхначная
Хм. Боюсь Вас шокировать, но никакого "на самом деле" не существует. Компьютерная логика - такая, какая заложена в железяки и софт, какую захотим, такую и сделаем. В железки заложена бинарная логика, для реляционных баз используется трехзначная (точнее - один из вариантов трехзначной логики), для конкретного приложения, если нужно, я легко могу запрограммировать хоть восьмизначную - не суть.

Frankie softwarerА при чем тут вообще клиент? Клиент - это отдельная песня.

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

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

А обосновать можно любой из этих ответов.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261278
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRПлз подробнее.
null в outer join - всего лишь дефолт, подставляемый в определенных случаях. Достаточно дополнить синтаксис выражений в селекте конструкцией default тра-ля-ля чтобы получить outer join, не испытывающий никаких проблем от отсутствия концепции null.
...
Рейтинг: 0 / 0
Ловушка 22
    #34261289
Sgt.Pepper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Sgt.PepperПростите, но почему бы используя Вашу логику не пойти дальше и в интовом атрибуте не убрать различия между null и нулем? ;)
Потому что для нуля в обычном его смысле - поле вещественных чисел и все такое - не выполняется сказанное мной требование "уже есть подобный спецсимвол, значение, играющее подобную же роль". Ноль не играет подобной роли, соответственно притягивание его к null-у будет неудобным.
Простите, возможно не очень хорошо понял идею "спецсимвола". Не могли бы Вы пояснить подробнее, по возможности с примером?

'softwarer' + null = null (не удобно)
'softwarer' + '' = 'softwarer' (удобно)

4213 + null = null (не удобно)
4213 + 0 = 4213 (удобно)

Это я пытаюсь следовать Вашей логике "как я ее понял". И пусть стандарты идут лесом :))
...
Рейтинг: 0 / 0
Ловушка 22
    #34261295
Frankie

В обеих случаях @a - NULL. А всё потому, что NULL это неопределённое значение, а значит никаких логических выводов на его основе делать невозможно, кроме is (not) null.

Совершенно верно. Относительно же уникального индекса: два неопределенных значения вполне могут "оказаться" двумя одинаковыми. Именно поэтому два нала не разрешается в уникальном индексе, а не потому, что два нала это равные значения :)
...
Рейтинг: 0 / 0
Ловушка 22
    #34261363
softwarer Александр Федоренконо null это всет таки неопределенное значение,
Есть и такая трактовка. Но с логической точки зрения она далеко не всегда удобна; скажем, она вполне оправдывает nullофобию топикстартера (согласитесь, "цена не задана" - вполне нормальная составляющая бизнес-модели, а вот "цена есть, но неопределенна" - мягко говоря, нелогично).

Цена не задана, т.е. не определена, т.е одно и то же. Цена есть как свойство товара, но неопределена (пока еще) как значение этого свойства. Чего-то вы мудрите уважаемый на пустом месте.


softwarer
Александр ФедоренкоСумма двух пустых строк даст пустую строку, а сумма null и пустой строки даст null, т.е неопределенное значение, что вполне естественно.
Это может быть и "естественно", хотя я с этим не соглашусь, но не удобно.

А чего тут может быть сомнительного? Если к "неопределенному" добавит "определенное", то .естественно. получится неопределенное. По определению Это надо принять как есть.
А неудобно кое что делать на потолке, как известно.


softwarer
Александр ФедоренкоИменно поэтому не может в уникальный ключ входить более двух значений null
1. Кто сказал, что не могут?
2. А почему именно более двух, а не более одного или более трех?

1. В данном случае я сказал :) Проверил на СУБД, с которой работаю.
2. А вот тут вы пожалуй правы: я бы и одно вхождение запретил, если по логике. Наверное реализоторы этой логики в субд пошли на компромис, для того, чтобы вообще можно было использовать поля с налом и уникальным индексом.
...
Рейтинг: 0 / 0
25 сообщений из 170, страница 5 из 7
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Ловушка 22
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]