|
|
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
FrankieОтсутствие значения есть суть null. Тогда пустая строка вполне укладывается в эту суть :) FrankieКакого ещё второго null? И как это так, что в типе данных уже есть значение? Если мне не изменяет память, стандарт определяет null как "значение, отличное от любого другого", попросту расширяет алфавит неким спецсимволом и дает ему специфическую роль. В принципе может случиться так, что в типе данных уже есть подобный спецсимвол, значение, играющее подобную же роль. В таком случае наличие различных между собой "sql-ного null" и "внутритипового спецсимвола с тем же смыслом" создает значительные неудобства, и будет вполне логично их отождествить. Авторы стандарта не предусмотрели этого момента, это их недочет. FrankieКонечно, реализация языка часто приписывает это значение, когда переменная определяется, но в большинстве случаев это и есть null / nil. Хм. Поймите: sql-ный null, паскалевский nil, дельфовый null, сишный NULL - это не то чтобы все совсем одно и то же. Это разные вещи, не стоит их безоговорочно смешивать. FrankieИнтересно как на этот счёт ведут себя другие языки... Ява - если не изменяет память, аналогично. В сях и сипласпласах нет стандартного класса строки, зависит от реализации. Там, где используется PChar или char*, в принципе зависит от реализации, от того, как обрабатывается этот момент. Скажем, большинство функций WinAPI понимают nil как пустую строку, но есть исключения, некоторые падают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2007, 13:13 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer FrankieОтсутствие значения есть суть null. Тогда пустая строка вполне укладывается в эту суть :) Но в эту суть вполне не укладываются ваши рассуждения о неком спецсимволе null. softwarerЕсли мне не изменяет память, стандарт определяет null как "значение, отличное от любого другого", попросту расширяет алфавит неким спецсимволом и дает ему специфическую роль. Ловко вы, однако, приравняли "значение" и "спецсимвол"! Конечно, подобная трактовка может быть реализована, но думается, что на деле нету никакого символа, а есть просто нулевой указатель (в никуда). softwarerВ принципе может случиться так, что в типе данных уже есть подобный спецсимвол, значение, играющее подобную же роль. В таком случае наличие различных между собой "sql-ного null" и "внутритипового спецсимвола с тем же смыслом" создает значительные неудобства, и будет вполне логично их отождествить. Авторы стандарта не предусмотрели этого момента, это их недочет. Интересно какие? Вроде как при перетаскивании информации на клиент типы данных из запроса приводятся в наиболее близкие клиентские. Так что на sql-null приложению плевать. Отождествить? Не согласен. В БД null это пустая ячейка, в программировании - указатель в никуда. Память программы - не база данных, всё ж. softwarerХм. Поймите: sql-ный null, паскалевский nil, дельфовый null, сишный NULL - это не то чтобы все совсем одно и то же. Это разные вещи, не стоит их безоговорочно смешивать. С sqlным конечно. А в остальном так не вижу особой разницы (наверняка она есть для низкоуровневых программ), гораздо важнее как ведут себя с нуллом операторы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2007, 14:03 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Пару слов по теме: какая-то у автора странная nullофобия. Блин, ну раз в любой СУБД эта вещь есть и есть немало средств по работе с ним, то зачем-то она нужна? Так изучите и пользуйтесь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2007, 14:15 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
SQL и NULL: Можно обойтись без NULL в исходных таблицах (только много их будет), но без NULL невозможен Outer Join, что уж совсем скучно. Ну а если NULL все равно пролез, так почему бы не использовать и в таблицах - будет их поменьше. Так что Frankieизучите и пользуйтесь! +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2007, 16:22 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
ModelRно без NULL невозможен Outer Join Это ошибочное утверждение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2007, 16:40 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
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 - "логический парадокс", которого в поле никогда не должно быть, иначе обрушится вся бизнес-логика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2007, 18:36 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer FrankieОтсутствие значения есть суть null. Тогда пустая строка вполне укладывается в эту суть :) Извиняюсь, что встреваю в вашу задушевную беседу :) но null это всет таки неопределенное значение, а пустая строка это конкретно пустая строка. Сумма двух пустых строк даст пустую строку, а сумма null и пустой строки даст null, т.е неопределенное значение, что вполне естественно. Именно поэтому не может в уникальный ключ входить более двух значений null, потому что среди двух неопределенных значений могут попасться и два одинаковых ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2007, 23:54 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Александр ФедоренкоИменно поэтому не может в уникальный ключ входить более двух значений null, потому что среди двух неопределенных значений могут попасться и два одинаковыхЕсли интерпретировать null как пустую строку, то с выводами можно было бы согласиться. В случае же понимания null именно как неопределенной величины, то, по стандарту ANSI, один null не равен другому и соответственно ограничение вида UNIQUE должно позволять любое множество таких значений. И с этой точки зрения MSSQL, например, нарушает данное требование стандарта, пусть даже такое ограничение и возможно сэмулировать. Кстати, softwarer, не просветите, как поведет себя Oracle, если наложить на поле строкового типа ограничения UNIQUE, а затем добавить 2 записи со значением NULL в этом поле. Как он будет их интепретировать, как 2 NULL-а, и разрешит, или как 2 пустых строки - и не разрешит ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 02:37 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
ChA Александр ФедоренкоИменно поэтому не может в уникальный ключ входить более двух значений null, потому что среди двух неопределенных значений могут попасться и два одинаковыхЕсли интерпретировать null как пустую строку, то с выводами можно было бы согласиться. В случае же понимания null именно как неопределенной величины, то, по стандарту ANSI, один null не равен другому Эта не вся правда. Другая правда это то, что условие один null не равен другому тоже фальш - любое сравнение с null дает фальш. Потому как значение не определено. В этом-то и логическая тонкость null. Но на этом вся его тонкость и заканчивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 02:51 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
ChAКстати, softwarer, не просветите, как поведет себя Oracle, если наложить на поле строкового типа ограничения UNIQUE, а затем добавить 2 записи со значением NULL в этом поле. Как он будет их интепретировать, как 2 NULL-а, и разрешит, или как 2 пустых строки - и не разрешит ? Inormix интерпретирует естественно как null и естественно второе значение запрещает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 02:53 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Александр Федоренкоусловие один null не равен другому тоже фальш - любое сравнение с null дает фальш.Не совсем так, с появлением null логика становится трехзначной SQL2003a) If either XV or YV is the null value, then X <comp op> Y is Unknown . Думаю согласитесь, что Unknown и False - вещи немного разные ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 03:24 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
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? Могу обосновать, если хотите... Отдельное спасибо вступившимся участникам дискуссии, очень интересно ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 10:25 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer FrankieОтсутствие значения есть суть null. Тогда пустая строка вполне укладывается в эту суть :) Простите, но почему бы используя Вашу логику не пойти дальше и в интовом атрибуте не убрать различия между null и нулем? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 10:36 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 11:12 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Александр ФедоренкоОн неверен, потому что основан только на одной половинке правды. Вернее "один 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 11:24 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов ModelRно без NULL невозможен Outer Join Это ошибочное утверждение.Плз подробнее. XAB1p YAC2q Select X.*, Y.C from X left join Y on X.A=Y.A JoinABC1p ?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 11:29 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Александр Федоренко Он неверен, потому что основан только на одной половинке правды. Вернее "один 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 - успешно сравнилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 11:44 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Александр Федоренконо null это всет таки неопределенное значение, Есть и такая трактовка. Но с логической точки зрения она далеко не всегда удобна; скажем, она вполне оправдывает nullофобию топикстартера (согласитесь, "цена не задана" - вполне нормальная составляющая бизнес-модели, а вот "цена есть, но неопределенна" - мягко говоря, нелогично). Александр ФедоренкоСумма двух пустых строк даст пустую строку, а сумма null и пустой строки даст null, т.е неопределенное значение, что вполне естественно. Это может быть и "естественно", хотя я с этим не соглашусь, но не удобно. Александр ФедоренкоИменно поэтому не может в уникальный ключ входить более двух значений null 1. Кто сказал, что не могут? 2. А почему именно более двух, а не более одного или более трех? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 12:04 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 12:10 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Sgt.PepperПростите, но почему бы используя Вашу логику не пойти дальше и в интовом атрибуте не убрать различия между null и нулем? ;) Потому что для нуля в обычном его смысле - поле вещественных чисел и все такое - не выполняется сказанное мной требование "уже есть подобный спецсимвол, значение, играющее подобную же роль". Ноль не играет подобной роли, соответственно притягивание его к null-у будет неудобным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 12:13 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Александр ФедоренкоInormix интерпретирует естественно как null и естественно второе значение запрещает. Значит, Informix, как и MSSQL, нарушает в этом месте стандарт ANSI. Спасибо, будет лишняя информация к очередному разговору с любителями действовать "строго по стандарту". FrankieЧиатл в какой-то книге по основам программирования, что компьютерная логика на самом деле и есть трёхначная Хм. Боюсь Вас шокировать, но никакого "на самом деле" не существует. Компьютерная логика - такая, какая заложена в железяки и софт, какую захотим, такую и сделаем. В железки заложена бинарная логика, для реляционных баз используется трехзначная (точнее - один из вариантов трехзначной логики), для конкретного приложения, если нужно, я легко могу запрограммировать хоть восьмизначную - не суть. Frankie softwarerА при чем тут вообще клиент? Клиент - это отдельная песня. Вы же практик? Так на практике важно, как клиент обработает поступивший от сервера NULL. Важно, но это совершенно отдельный вопрос, не имеющий никакого отношения к обработке NULL сервером. С точки зрения клиента мне представляется наилучшим, если клиент имеет адекватный инструмент, клиентский null. FrankieМогу обосновать, если хотите... Не нужно, спасибо. Ваш ответ показывает, что Вы предпочитаете как раз в ту проблему неоднозначности, которая доставляет дополнительные хлопоты по сравнению с ситуацией, где неоднозначности нет. А обосновать можно любой из этих ответов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 12:24 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
ModelRПлз подробнее. null в outer join - всего лишь дефолт, подставляемый в определенных случаях. Достаточно дополнить синтаксис выражений в селекте конструкцией default тра-ля-ля чтобы получить outer join, не испытывающий никаких проблем от отсутствия концепции null. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 12:29 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer Sgt.PepperПростите, но почему бы используя Вашу логику не пойти дальше и в интовом атрибуте не убрать различия между null и нулем? ;) Потому что для нуля в обычном его смысле - поле вещественных чисел и все такое - не выполняется сказанное мной требование "уже есть подобный спецсимвол, значение, играющее подобную же роль". Ноль не играет подобной роли, соответственно притягивание его к null-у будет неудобным. Простите, возможно не очень хорошо понял идею "спецсимвола". Не могли бы Вы пояснить подробнее, по возможности с примером? 'softwarer' + null = null (не удобно) 'softwarer' + '' = 'softwarer' (удобно) 4213 + null = null (не удобно) 4213 + 0 = 4213 (удобно) Это я пытаюсь следовать Вашей логике "как я ее понял". И пусть стандарты идут лесом :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 12:32 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
Frankie В обеих случаях @a - NULL. А всё потому, что NULL это неопределённое значение, а значит никаких логических выводов на его основе делать невозможно, кроме is (not) null. Совершенно верно. Относительно же уникального индекса: два неопределенных значения вполне могут "оказаться" двумя одинаковыми. Именно поэтому два нала не разрешается в уникальном индексе, а не потому, что два нала это равные значения :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 12:33 |
|
||
|
Ловушка 22
|
|||
|---|---|---|---|
|
#18+
softwarer Александр Федоренконо null это всет таки неопределенное значение, Есть и такая трактовка. Но с логической точки зрения она далеко не всегда удобна; скажем, она вполне оправдывает nullофобию топикстартера (согласитесь, "цена не задана" - вполне нормальная составляющая бизнес-модели, а вот "цена есть, но неопределенна" - мягко говоря, нелогично). Цена не задана, т.е. не определена, т.е одно и то же. Цена есть как свойство товара, но неопределена (пока еще) как значение этого свойства. Чего-то вы мудрите уважаемый на пустом месте. softwarer Александр ФедоренкоСумма двух пустых строк даст пустую строку, а сумма null и пустой строки даст null, т.е неопределенное значение, что вполне естественно. Это может быть и "естественно", хотя я с этим не соглашусь, но не удобно. А чего тут может быть сомнительного? Если к "неопределенному" добавит "определенное", то .естественно. получится неопределенное. По определению Это надо принять как есть. А неудобно кое что делать на потолке, как известно. softwarer Александр ФедоренкоИменно поэтому не может в уникальный ключ входить более двух значений null 1. Кто сказал, что не могут? 2. А почему именно более двух, а не более одного или более трех? 1. В данном случае я сказал :) Проверил на СУБД, с которой работаю. 2. А вот тут вы пожалуй правы: я бы и одно вхождение запретил, если по логике. Наверное реализоторы этой логики в субд пошли на компромис, для того, чтобы вообще можно было использовать поля с налом и уникальным индексом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2007, 12:47 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34258798&tid=1544780]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
173ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
86ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 541ms |

| 0 / 0 |
