Текущий архив: 2008.08.24;
Скачать: CL | DM;
Вниз
Отождествление пустой строки и NULL Найти похожие ветки
← →
pasha_golub © (2008-07-01 15:07) [0]Помню была такая тема. Почти что "святая война". Но тут столкнулся с проблемой, что пользователь упорно мне доказывает целесообразность данного момента в моих компонентах-наследниках TDataset.
Я стою на своем, что это разные сущности абсолютно. А он предлагает компромисс - ввести флаг и по желанию программиста, чтобы работало то так, а то эдак.
Самое плохое, что привел примеры програм, которые так и поступают. Например, pgAdminIII, DOA для Oracle, IBX для Interbase/Firebird...
Каковы мысли? Я понимаю, что это супротив стандарта. Но если рынок требует, может стоит?
← →
Ega23 © (2008-07-01 15:10) [1]Если сильно настаивает и готов за это дело заплатить - то пуркуа бы и не па?
← →
pasha_golub © (2008-07-01 15:12) [2]
> Ega23 © (01.07.08 15:10) [1]
А совесть куда деть? :)) Меня от одной мысли коробит. У меня ж отец военный. Не положено по уставу.
← →
McSimm © (2008-07-01 15:13) [3]
> А совесть куда деть?
отдельной строкой в смете :)
← →
pasha_golub © (2008-07-01 15:18) [4]Тут ведь еще какой момент NULL <> NULL, а "" = "". Ну и прочие вкусности. В том же запросе WHERE .. IS NULL супротив WHERE ... = ""
Опять же, если это так востребовано почему это не реализовано в серверной логике? Даже параметра такого нету.
← →
Игорь Шевченко © (2008-07-01 15:19) [5]
> Отождествление пустой строки и NULL
У меня к тебе вопрос - а как ты их визуально различишь ?
← →
Ega23 © (2008-07-01 15:20) [6]Подожди. Речь о том, чтобы НА СЕРВЕРЕ подменить Null на ""? Или всё-таки на клиенте?
← →
Правильный-Вася (2008-07-01 15:29) [7]
> а как ты их визуально различишь ?
а зачем? визуал - это последнее из применений
а остальные - сплошь автоматы
и геморроиться в проверкой нуллов, если мне это не надо, не хочется
← →
Ega23 © (2008-07-01 15:32) [8]Я не вижу ничего дурного в том, что если у тебя ftString - то при Null-значении показывать "", если ftInteger - то 0 и т.п.
На крайняк - ввести макроподстановку в свойство филда, типа при Null-значении писать "" или "Пусто" или "NULL".
Но - только для отображения.
← →
Игорь Шевченко © (2008-07-01 15:34) [9]Мало того, что я не понимаю, каков фактический смысл отличия "" от NULL с точки зрения предметной области, я еще и не понимаю, как их визуально отличать. Например, как отличать 0 от NULL я знаю, а вот со строками - тупик.
← →
Плохиш © (2008-07-01 15:34) [10]
> pasha_golub © (01.07.08 15:07)
> Помню была такая тема. Почти что "святая война". Но тут
> столкнулся с проблемой, что пользователь упорно мне доказывает
> целесообразность данного момента в моих компонентах-наследниках
> TDataset.
Хм, а свойству asString как-то пофигу, что там null или строка нулевой длины...
← →
pasha_golub © (2008-07-01 15:39) [11]
> Игорь Шевченко © (01.07.08 15:34) [9]
> Мало того, что я не понимаю, каков фактический смысл отличия
> "" от NULL с точки зрения предметной области, я еще и не
> понимаю, как их визуально отличать.
Визуальность - дело последнее. Например, пустая строка это нейтральный элемент относительно операции конкатенации, как и 0 в случае сложения. Однако, если сделать "string" || NULL, то получаем NULL.
Визуально, конечно, да. Пользователю один черт что пустое место, что надпись NULL
← →
Ega23 © (2008-07-01 15:40) [12]
> Хм, а свойству asString как-то пофигу, что там null или
> строка нулевой длины...
>
И чё? TField.GetAsString : string; virtual;
Как хошь перекрыть можно.
← →
pasha_golub © (2008-07-01 15:41) [13]
> Я не вижу ничего дурного в том, что если у тебя ftString
> - то при Null-значении показывать "", если ftInteger - то
> 0 и т.п.
Со строками еще куда ни шло, а вот с числами... Поле Зарплата, например, то ли NULL - неизвестно или не начислено, или 0. :-)
← →
Игорь Шевченко © (2008-07-01 15:42) [14]pasha_golub © (01.07.08 15:39) [11]
> Визуальность - дело последнее. Например, пустая строка это
> нейтральный элемент относительно операции конкатенации,
> как и 0 в случае сложения. Однако, если сделать "string"
> || NULL, то получаем NULL.
я@ora10> select "Foo"||NULL from dual;
"FO
---
Foo
я@ora10>
Мне не верить своим глазам ?
← →
Игорь Шевченко © (2008-07-01 15:43) [15]
> Поле Зарплата, например, то ли NULL - неизвестно или не
> начислено,
не определено.
← →
Ega23 © (2008-07-01 15:44) [16]Павель, вот никогда бы полю, отвечающему за деньги NULL бы не поставил. Ибо - Sum чему равно будет? :)
← →
oldman © (2008-07-01 15:46) [17]
> пользователь упорно мне доказывает целесообразность данного
> момента
КЛИЕНТ ВСЕГДА ПРАВ!!!
← →
McSimm © (2008-07-01 15:47) [18]
> Ибо - Sum чему равно будет?
Все правильно - пока все слагаемы не известны, суммировать опасно.
А то получится 10 конфет каждому по 8 :)
← →
Ega23 © (2008-07-01 15:47) [19]
> Мне не верить своим глазам ?
MSSQL 2000
Declare @x varchar(10), @y varchar(10)
Set @x=null; Set @y="foo"
Select @x + @y
--------------------
NULL
(1 row(s) affected)
← →
Ega23 © (2008-07-01 15:48) [20]
> Все правильно - пока все слагаемы не известны, суммировать
> опасно.
Ну тот же MSSQL :
create table xxx(A int null)
insert into xxx(A) Values (default)
insert into xxx(A) Values (1)
insert into xxx(A) Values (2)
insert into xxx(A) Values (3)
insert into xxx(A) Values (4)
Select Sum(A) from xxx
drop table xxx
-----------
10
(1 row(s) affected)
Warning: Null value is eliminated by an aggregate or other SET operation.
← →
Игорь Шевченко © (2008-07-01 15:48) [21]Ega23 © (01.07.08 15:47) [19]
Я сильно извиняюсь, а в MSSQL пустая строка и NULL это одно и тоже, как и в Oracle ?
← →
Ega23 © (2008-07-01 15:50) [22]
> Я сильно извиняюсь, а в MSSQL пустая строка и NULL это одно
> и тоже, как и в Oracle ?
>
Нет. Пустая строка <> NULL. И NULL<> пустому НД (IsEmpty).
← →
Игорь Шевченко © (2008-07-01 15:53) [23]Кстати, в oracle
я@ora10> create table xxx(A int null);
Table created.
я@ora10> insert into xxx(A) Values (null);
1 row created.
я@ora10> insert into xxx(A) Values (1);
1 row created.
я@ora10> insert into xxx(A) Values (2);
1 row created.
я@ora10> insert into xxx(A) Values (3);
1 row created.
я@ora10> insert into xxx(A) Values (4);
1 row created.
я@ora10> Select Sum(A) from xxx;
SUM(A)
----------
10
Но:
я@ora10> Select Sum(A+10) from xxx;
SUM(A+10)
----------
50
то есть, в случае A is NULL, A + 10 тоже NULL
← →
Игорь Шевченко © (2008-07-01 15:54) [24]
> Нет. Пустая строка <> NULL. И NULL<> пустому НД (IsEmpty).
тогда пример ничего не показывает
← →
McSimm © (2008-07-01 15:55) [25]
> Select Sum(A) from xxx
Ну, спасибо хоть Warning выдал...
← →
Ega23 © (2008-07-01 15:57) [26]
> тогда пример ничего не показывает
Почему? При конкатенации строк если один из операндов NULL - то и результат NULL. порядок операндов не важен.
В случае с числами - посложнее. по крайней мере, Warning выдаст.
ИМХО: сам использую null только в двух случаях:
1. Иерархические структуры (для определения корневого элемента)
2. При хранении метаданных (BLOB). И то не всегда.
← →
McSimm © (2008-07-01 15:59) [27]Да, я напутал, агрегатные функции действительно обычно просто пропускают значения NULL, а в операциях приводят к NULL результат
← →
Игорь Шевченко © (2008-07-01 16:01) [28]
> При конкатенации строк если один из операндов NULL - то
> и результат NULL. порядок операндов не важен.
а в оракле нет, именно пример с конкатенацией я и привел в [14]
в oracle пустая строка и NULL - это одно и то же. При конкатенации NULL себя ведет, как пустая строка. Вполне разумно. Мне представляется, что в Oracle тоже не понимали до конца, какое отличие с точки зрения предметной области имеют NULL и "", а главное - как их визуально отличать :)
← →
pasha_golub © (2008-07-01 16:08) [29]
> в oracle пустая строка и NULL - это одно и то же.
Однако. Не знал, что Оракловцы настолько смелы. Обычно это в стиле МС класть прибор на стандарты.
← →
Ega23 © (2008-07-01 16:09) [30]
> Мне представляется, что в Oracle тоже не понимали до конца,
> какое отличие с точки зрения предметной области имеют NULL
> и "", а главное - как их визуально отличать :)
Да также, как и с PChar. p=nil и p^="".
Т.е. в одном случае - вааще хзч. В другом - всё-таки пустая строка. :)
← →
McSimm © (2008-07-01 16:09) [31]
> Игорь Шевченко © (01.07.08 16:01) [28]
Никогда не сталкивался, просто интересно - а как в Оракл unique key отнесётся к нескольким пустым строкам ?
← →
pasha_golub © (2008-07-01 16:10) [32]
> McSimm © (01.07.08 16:09) [31]
> а как в Оракл unique key отнесётся к нескольким пустым строкам
> ?
Во, кстати, классный вопрос!
← →
Игорь Шевченко © (2008-07-01 16:13) [33]McSimm © (01.07.08 16:09) [31]
> а как в Оракл unique key отнесётся к нескольким пустым строкам
> ?
Проигнорирует. Значения NULL в UNIQUE (именно в UNIQUE) не попадают, на чем основано немало остроумных решений проблем.
Но, если ключ состоит из нескольких полей и одно может принимать значение NULL, то два набора с одинаковым значением одного поля и NULL другого поля вызовут нарушение уникальности.
pasha_golub © (01.07.08 16:08) [29]
> Однако. Не знал, что Оракловцы настолько смелы. Обычно это
> в стиле МС класть прибор на стандарты.
Оракл появился немного раньше стандартов.
← →
Поросенок Винни-Пух © (2008-07-01 16:13) [34]никак. форинкеи допускают нулы, а юник нет
← →
Ega23 © (2008-07-01 16:14) [35]
> Никогда не сталкивался, просто интересно - а как в Оракл
> unique key отнесётся к нескольким пустым строкам ?
>
ИМХО, также, как и везде - обматерит.
ЕМНИП, для MSSQL индекс допускается только в том случае, если есть только одно значение Null. Для первичного ключа - вообще не допускается. Для вторичного - можно много null (но он и не является индексом, только "кандидатом" на индекс).
← →
atruhin1 (2008-07-01 16:15) [36]> Например, pgAdminIII, DOA для Oracle, IBX для Interbase/Firebird...
Ну про pgAdminIII не знаю, а про IBX для Interbase/Firebird ты не прав, в IB/FB и соответственно,
в компонентах это абсолютно разные вещи. Так же как и в MS SQL, т.е. по стандарту.
Oracle поступает по своему, там NULL = "", по моему, обсуждалось много раз, на всех сайтах.
Иногда удобно, иногда нет. Для остальных типов данных (кроме строк) Oracle работает по стандарту.
← →
Поросенок Винни-Пух © (2008-07-01 16:15) [37]Однако. Не знал, что Оракловцы настолько смелы. Обычно это в стиле МС класть прибор на стандарты.
Общий подход это использовать либо спец значения типов если они есть, или флаги нулов.
Пустая строка это как раз то спец значение строкового типа, которое позволяет обойтись без флагов.
← →
Ega23 © (2008-07-01 16:16) [38]
> ЕМНИП, для MSSQL индекс допускается только в том случае,
> если есть только одно значение Null.
Был неправ:
UNIQUE constraints can be defined on columns that allow null values, whereas PRIMARY KEY constraints can be defined only on columns that do not allow null values.
← →
atruhin1 (2008-07-01 16:17) [39]Нда, опоздал немного с ответом.
← →
Игорь Шевченко © (2008-07-01 16:20) [40]Если пример [23] дополнить:
я@ora10> create unique index yyy on xxx(a);
Index created.
я@ora10> select * from xxx order by a;
A
----------
1
2
3
4
я@ora10> insert into xxx values(NULL);
1 row created.
я@ora10> select * from xxx order by a;
A
----------
1
2
3
4
6 rows selected.Execution Plan
----------------------------------------------------------
Plan hash value: 4016984797
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 6 | 78 | 4 (25)| 00:00:01 |
| 1 | SORT ORDER BY | | 6 | 78 | 4 (25)| 00:00:01 |
| 2 | TABLE ACCESS FULL| XXX | 6 | 78 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Видно, что индекс игнорируется, потому что есть значения NULL, а запрошены все записи.
но:
я@ora10>select * from xxx where a is not null order by a
A
----------
1
2
3
4Execution Plan
----------------------------------------------------------
Plan hash value: 2441963755
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 52 | 1 (0)| 00:00:01 |
|* 1 | INDEX FULL SCAN | YYY | 4 | 52 | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------
← →
pasha_golub © (2008-07-01 16:21) [41]
> atruhin1 (01.07.08 16:15) [36]
> а про IBX для Interbase/Firebird ты не прав, в IB/FB и
> соответственно,
> в компонентах это абсолютно разные вещи.
Прошу прощения. Я сам не проверял. Все со слов пользователя.
← →
pasha_golub © (2008-07-01 16:25) [42]А еще один довод от пользователя.
CREATE TABLE ..(
somecol char(1) CHECK somecol in ("M", "W")
)
И соответственно в таком виде NULL позволяется, а пользователь не может его вставить через грид или другой какой контрол.
← →
Игорь Шевченко © (2008-07-01 16:26) [43]
> И соответственно в таком виде NULL позволяется
не позволяется. Он вызывает нарушение ограничения :)
← →
McSimm © (2008-07-01 16:28) [44]Всякое бывает.
Другой какой-нибудь контрол обработает, к примеру, Ctrl-Del и отобразит [NULL]
← →
Ega23 © (2008-07-01 16:30) [45]
somecol char(1) CHECK somecol in ("M", "W")
А где "Ребёнок" и "Домашнее жЫвотное"? :)
← →
pasha_golub © (2008-07-01 16:31) [46]
> Игорь Шевченко © (01.07.08 16:26) [43]
>
> не позволяется. Он вызывает нарушение ограничения :)
Не знаю как в Оракле, но в Постгресе не вызовет
← →
pasha_golub © (2008-07-01 16:32) [47]
> McSimm © (01.07.08 16:28) [44]
> Другой какой-нибудь контрол обработает, к примеру, Ctrl-
> Del и отобразит [NULL]
И ведь не поспоришь.
> Ega23 © (01.07.08 16:30) [45]
> А где "Ребёнок" и "Домашнее жЫвотное"? :)
Не догадалсо. :) я обычно пишу M\F (male\female), однако есть еще люди которым ближе man\woman :)
← →
pasha_golub © (2008-07-01 16:34) [48]Кстати, по поводу приведенного примера я чего еще задумался. Ведь char(1) должен состоять из одного символа и точка. Это ведь не varchar(1). То есть в таком случае было бы может и логично пустую строку возводить в статус NULL, однако в случае varchar религия имеет место быть.
← →
Игорь Шевченко © (2008-07-01 16:37) [49]
> я обычно пишу M\F (male\female),
sometimes camel
> Это ведь не varchar(1).
varchar(1) тоже состоит из одного символа и точка. Из половины символа он состоять не может. В оракле так они даже хранятся одинаково char(1) и varchar(1)
← →
Anatoly Podgoretsky © (2008-07-01 16:37) [50]> pasha_golub (01.07.2008 15:07:00) [0]
TDataset говоришь?
Так ничего не выйдет, пустая строка равна nil и никакой структуры строки. Не возможно представить строку по другому как пустое в Дельфи. В базе может и можно.
← →
Anatoly Podgoretsky © (2008-07-01 16:39) [51]> pasha_golub (01.07.2008 15:18:04) [4]
А где тут TDataset?
При том это всего лишь особенность получается при присвоение значения и обратно никак, только если специально присвоить NULL.
А этим NULL <> NULL ты что хотел сказать?
← →
Anatoly Podgoretsky © (2008-07-01 16:40) [52]> Ega23 (01.07.2008 15:20:06) [6]
В вопросе на клиенте, и при том для типа string
А дальше пошел какой то разброд, уже далекий от вопроса.
← →
Anatoly Podgoretsky © (2008-07-01 16:41) [53]> Ega23 (01.07.2008 15:32:08) [8]
> ftString - то при Null-значении показывать ""
А это как, хочешь Дельфи переписать?
← →
Ega23 © (2008-07-01 16:41) [54]
> sometimes camel
>
упалпацтул!!!
КЛАСС!!!! :)))))))))))))
← →
Anatoly Podgoretsky © (2008-07-01 16:43) [55]> pasha_golub (01.07.2008 15:07:00) [0]
Кстати ты собираешься ограничиться только этими серверами? И где в них там TDataset
← →
Anatoly Podgoretsky © (2008-07-01 16:45) [56]> Ega23 (01.07.2008 15:44:16) [16]
Так не все же архитекторы грамотные.
Кстати как насчет минуса? Тоже не так одназначно.
← →
Anatoly Podgoretsky © (2008-07-01 16:46) [57]> Ega23 (01.07.2008 15:47:19) [19]
Ага значит все таки о конкретных серверах будем говорить, тогда посмотри ANSII настройки. В частности SET NULLS в БОЛ
← →
Anatoly Podgoretsky © (2008-07-01 16:49) [58]> Игорь Шевченко (01.07.2008 15:48:21) [21]
Разные вещи, NULL соответствует определению ANSI если только поведение не изменено для ANSI настроек, пошли кое где на поводу старого матобоеспечения (FoxPro например, а это у них основной носитель для импорта/экспорта).
Про Oracle молчим, Oracle и стандарты, это рок против наркотиков.
← →
Anatoly Podgoretsky © (2008-07-01 16:51) [59]> Игорь Шевченко (01.07.2008 16:01:28) [28]
Твое предположение верно, может тебе попадались обсуждения с разработчиками по этому поводу.
← →
Anatoly Podgoretsky © (2008-07-01 16:52) [60]> pasha_golub (01.07.2008 16:08:29) [29]
Видишь ли МС не кладет, а позволяет управлять этим, а насколько я помню Оракл именно кладет. При том вроде и не последовательны.
← →
Anatoly Podgoretsky © (2008-07-01 16:54) [61]> McSimm (01.07.2008 16:09:31) [31]
Пустым ты что в данном случае считаешь, если "" то по стандарту одну можно. А если NULL то по стандарту ни одно, поскольку NULL это не определено, то оно и не может представлять собой конкретную строку, а вот пустая строка может.
← →
Anatoly Podgoretsky © (2008-07-01 16:55) [62]> Игорь Шевченко (01.07.2008 16:13:33) [33]
> Оракл появился немного раньше стандартов.
И вырос в такого монстра, что плевал на всех, он сам себе стандарт.
← →
Anatoly Podgoretsky © (2008-07-01 16:57) [63]> atruhin1 (01.07.2008 16:15:36) [36]
> Иногда удобно, иногда нет.
Вот это не должно быть основанием, поскольку результаты не гарантируются, не пройдет даже тестов.
← →
McSimm © (2008-07-01 16:58) [64]
> Пустым ты что в данном случае считаешь, если "" то по стандарту
> одну можно. А если NULL то по стандарту ни одно, поскольку
> NULL это не определено
Так вопрос про Оракл был, где "" и NULL суть одно.
Насчет стандарта - не совсем понял. Unique key, насколько я с ними сталкивался, позволяет хранить NULL в любом количестве.
← →
Ega23 © (2008-07-01 17:01) [65]
> Unique key, насколько я с ними сталкивался, позволяет хранить
> NULL в любом количестве.
Короче, была какая-то фигня с Null. То ли с FTS, то ли с индексом...
В смысле, что только одно значение null в столбце на всю таблицу.
← →
Игорь Шевченко © (2008-07-01 17:23) [66]Anatoly Podgoretsky © (01.07.08 16:55) [62]
> И вырос в такого монстра, что плевал на всех, он сам себе
> стандарт.
Насколько мне известно, стандарту целиком и полностью не соответствует ни одна СУБД. У каждой есть свои расширения, отходящие от стандарта.
Кстати, сам Оракл пишет в документации:
"Oracle Database currently treats a character value with a length of zero as null. However, this may not continue to be true in future releases, and Oracle recommends that you do not treat empty strings the same as nulls."
← →
Поросенок Винни-Пух © (2008-07-01 17:37) [67]то оно и не может представлять собой конкретную строку, а вот пустая строка может.
Если пустая строка может представлять конкретную строку ("равноправное" значение строкового типа), то тогда было бы возможно определить сколько именно таких значений содержится в этом посте.
А этого никто определить не сможет.
← →
McSimm © (2008-07-01 17:44) [68]
> сколько именно таких значений содержится в этом посте.
Я могу это определить.
Этот пост представляет собой запись из нескольких полей (некоторые отображаются, некоторые нет). Из отображаемых - одно поле представляет собой пустую строку.
А дробить одно поле - некорректно. Или придется считать количество нулей в числе 17.
← →
Поросенок Винни-Пух © (2008-07-01 17:48) [69]Я могу это определить.
Допустим.
Определил, что из там 10.
А я утверждаю что изх там 1000.
Как определить кто прав?
← →
McSimm © (2008-07-01 17:53) [70]
> Как определить кто прав?
гм... я даже теряюсь... при таком подходе остается только назначить незаинтересованных арбитров и спросить кому они больше верят :)
Я даже могу предоставить саму запись на рассмотрение (хотя ее и так видно)
name: "Поросенок Винни-Пух",
email: "",
ip: "**.***.**.***"
и т.д.
← →
McSimm © (2008-07-01 17:58) [71]есть еще вариант, спросить у perl
# smth like this
foreach (keys %fields) {
$count++ if ($REC{$_} eq "");
}
← →
Поросенок Винни-Пух © (2008-07-01 18:02) [72]ну зачем же отмахиваться от простого вопроса?
есть два строковых литерала, один пустой;
я с помошью нескольких конкатенаций делаю из них итоговую строку.
вопрос: определить по итоговой строке сколько раз я в нее вставил пустой литерал.
← →
pasha_golub © (2008-07-01 18:07) [73]
> Поросенок Винни-Пух © (01.07.08 17:37) [67]
> Если пустая строка может представлять конкретную строку
> ("равноправное" значение строкового типа), то тогда было
> бы возможно определить сколько именно таких значений содержится
> в этом посте.
Нелогично размышляете. Я уже писал что пустая строка есть инвариант по отношению к операции конкатенации. Можно провести паралели с каноническим разложением числа на множители (сорри если коряво звучит, учил на украинском), коее имеет вид a = p1^n1*p2^n2...*pk^nk*E, где pi - простые числа неравные 1.
← →
McSimm © (2008-07-01 18:08) [74]
> ну зачем же отмахиваться от простого вопроса?
> есть два строковых литерала, один пустой;
> я с помошью нескольких конкатенаций делаю из них итоговую
> строку.
> вопрос: определить по итоговой строке сколько раз я в нее
> вставил пустой литерал.
Я уже писал про количество нулей в числе 17.
← →
pasha_golub © (2008-07-01 18:09) [75]
> Поросенок Винни-Пух © (01.07.08 18:02) [72]
> есть два строковых литерала, один пустой;
> я с помошью нескольких конкатенаций делаю из них итоговую
> строку.
> вопрос: определить по итоговой строке сколько раз я в нее
> вставил пустой литерал.
Есть два слагаемых, один из них 0. Я с помощью некоторых операций сложения делаю из них сумму.
Вопрос: определить по итоговой сумме сколько раз я прибавил 0
← →
McSimm © (2008-07-01 18:09) [76]Поле содержит одно значение. Можно считать сколько значений содержит запись или выборка. Какой смысл считать количество значений в одном поле ? (то же - в одной переменной) ?
← →
Поросенок Винни-Пух © (2008-07-01 18:10) [77]Я уже писал про количество нулей в числе 17.
не надо путать публику.
было сказано, что пустая строка - это точно такое же значение строкового типа, как и любая другая строка.
Так что это за значение такое, если его нельзя обнаружить и посчитать?
← →
McSimm © (2008-07-01 18:13) [78]И, кстати о конкатенациях, сколько значений "АА" содержится в строке "АААА" - два или три ?
← →
McSimm © (2008-07-01 18:14) [79]
> пустая строка - это точно такое же значение строкового типа,
> как и любая другая строка.
Равно как и 0 мало отличается от любого другого числового значения.
← →
McSimm © (2008-07-01 18:14) [80]
> И, кстати о конкатенациях, сколько значений "АА" содержится
> в строке "АААА" - два или три ?
Правильный ответ - ни одного
← →
Поросенок Винни-Пух © (2008-07-01 18:19) [81]И, кстати о конкатенациях, сколько значений "АА" содержится в строке "АААА" - два или три ?
Если строка получена конкатенацией двух литералов "AA", то там их две.
А я предлагаю определить то же самое для строки "AAAA", полученной конкатенацией "" и "A"
← →
McSimm © (2008-07-01 18:22) [82]I"ve given up... At least until you"ve counted zeroes in the number 17 that is the sum of numbers 0 and 1...
← →
Поросенок Винни-Пух © (2008-07-01 18:25) [83]не нравится конкатенация?
могу по другому:
открываем между собой тсп соединение, или создаем поток.
я делаю туда икс раз writebuff с пустой строкой, а ты считаешь сколько раз я это сделал.
и не вижу проблем. это же такое же "равноправное" значение как и все остальные строки.
← →
Поросенок Винни-Пух © (2008-07-01 18:33) [84]I"ve given up... At least until you"ve counted zeroes in the number 17 that is the sum of numbers 0 and 1...
сколько раз был записан в поток нулевой байт или нулевой word, dword etc я могу определить. а вот определи сколько раз я записал на носитель пустую строку.
слабо?
← →
McSimm © (2008-07-01 18:53) [85]
> и не вижу проблем
Я вижу, но это офтопик.
Контейнер для значения какого-либо типа это переменная или поле базы данных.
Количество значений в одном контейнере всегда одно.
Последняя попытка, чесслово :)
Пишем в буфер обычные равноправные строки "А" и "АА" и считаем.
← →
Поросенок Винни-Пух © (2008-07-01 19:13) [86]нет, уловки не прокатят. :)
в случае с буфером и "A" и "AA" по крайней мере можно определить, что хотя бы одно значение было записано в буфер.
с пустой строкой это не пройдет.
просто потому, что это никакое не "равноправное" значение строкового типа, а совершенно особенное. и его-то и использует оракл для строкового нула.
← →
Ega23 © (2008-07-01 19:17) [87]А при Join - что должно приходить?
← →
pasha_golub © (2008-07-01 19:23) [88]
> Поросенок Винни-Пух © (01.07.08 19:13) [86]
Почему Оракл не использует 0 для нулла?
← →
Anatoly Podgoretsky © (2008-07-01 19:25) [89]> Поросенок Винни-Пух (01.07.2008 17:37:07) [67]
Не понял, что именно ты имеешь в виду, но что ты скажешь про это Count(*) - Count(Field)
← →
McSimm © (2008-07-01 19:26) [90]
> в случае с буфером и "A" и "AA" по крайней мере можно определить,
> что хотя бы одно значение было записано в буфер.
Понятно, меняем условия на ходу. Смысла все меньше.
А я хочу определять хотя бы два.
> никакое не "равноправное" значение строкового типа, а совершенно
> особенное. и его-то и использует оракл для строкового нула.
Абсолютно любое значение можно назвать особенным.
Любое значение можно было бы выбрать для индикации NULL, но пустая строка больше всех подходит для этого.
С тем же успехом можно доказывать уникальность значения "-1"
← →
Anatoly Podgoretsky © (2008-07-01 19:30) [91]> McSimm (01.07.2008 18:13:18) [78]
Если про конкатенацию, то возможно ни одного.
А зачем пытаться делать обратно из фарша корову?
← →
Поросенок Винни-Пух © (2008-07-01 19:40) [92]Почему Оракл не использует 0 для нулла?
Потому что это действительно равноправное целочисленное значение среди других значений целых
← →
Anatoly Podgoretsky © (2008-07-01 19:43) [93]> Поросенок Винни-Пух (01.07.2008 19:13:26) [86]
Ошибаешься, для строки АААА определить сколько раз было записано АА невозможно, это невозможно даже строки АА
И никакого отношения к NULL и пустым строкам это не имеет отношения, это совершенно другой закон математики. Вроде бы транзитивность, не помню точное название термина.
Я для тебя дам несложную задачку - есть число, получено суммой трех чисел, каждое из которых больше нуля. Результат равен 1234567890. Чему равны A B C, Я тебе даже упрощаю задачу, я тебе назову одно из них, это два, а ты назови оставшие два. Попробуй сделать корову.
← →
Поросенок Винни-Пух © (2008-07-01 19:46) [94]Ошибаешься, для строки АААА определить сколько раз было записано АА невозможно, это невозможно даже строки АА
Извращенный пример.
Я же согласился, что с конкатенацией пример не очень удачен.
Вот пример удачный.
Берем двух экспериментаторов и две совершенно детерминированные строки. Обе известны обеим участникам эксперимента заранее.
Один делает writebuff, другой определяет сколько раз было записано значение в поток.
одна строка пустая, другая нет.
← →
McSimm © (2008-07-01 20:43) [95]
> одна строка пустая, другая нет.
лучше взять две непустые, меньше разговоров ниочем :)
← →
Anatoly Podgoretsky © (2008-07-01 20:50) [96]> Игорь Шевченко (01.07.2008 17:23:06) [66]
Я в курсе насчет этой фразы, ох и готовят они себе серьезную проблему, но что делать если они пошли против теории. Но я думаю они решат проблему путем введения соответствующей настройки, как в MS SQL
← →
DiamondShark © (2008-07-01 20:56) [97]
> Мне не верить своим глазам ?
Однако, отступление от стандарта.
← →
Игорь Шевченко © (2008-07-01 22:02) [98]
> Однако, отступление от стандарта.
Все СУБД где-то и в чем-то отступают от стандарта. Насколько мне известно, не существует ни одной СУБД, которая строго соответствует стандарту и только ему - ничего своего не привносит.
← →
Поросенок Винни-Пух © (2008-07-01 22:27) [99]Я бы еще понял, если бы за отличие нула от пустой строки высказывались бы программисты другого языка, в котором неинициализированную строковую переменную можно было бы отличить от пустой строки.
А если мы про delphi?
Ну вот есть у нас сервер который их различает и что дальше?
Типа вы такую ересь сочиняете?
function VeryStrangeFunction(AField : TField) : string
begin
if not AField.IsNull then
Result := AField.AsString
else
Result := "";
end;
нет не сочиняте.
Или строка может принять нул из базы и остаться отличной от пустой строки? Снова нет.
Или может быть вот такой код где переменные не инициализированы программистом может отличить строковый нул от пустой строки?
program test;
var var globalstr : string;
procedure test;
var localstr : string;
begin
if localstr <> globalstr then ShowMessage("Они таки разные!");
end;
end.
Не отличит. Потому что нулл и пустая строка это одно и то же.
← →
McSimm © (2008-07-01 23:06) [100]
> Потому что нулл и пустая строка это одно и то же
Иногда да, иногда нет.
Если иногда нет, значит скорее не одно и то же чем одно и то же.
Примеров, когда "иногда нет" можно привести множество.
← →
McSimm © (2008-07-01 23:10) [101](Имхо) доводы про неинициализированные переменные вообще лишены смысла.
← →
Поросенок Винни-Пух © (2008-07-01 23:25) [102]доводы про неинициализированные переменные вообще лишены смысла.
Это если его не хотеть замечать.
Неинициализированное значение типа на сервере это нулл.
Но на некоторых серверах можно отличить нулл от пустой строки.
Неинициализированное строковое значение в delphi это пустая строка.
И нет способа присвоить строке значение нулл отличное от пустой строкию.
а в желании отличать на сервере нул от пустой строки смысла еще меньше.
на клиенте в результате чтения строки из поля будет все равно пустая строка. И в случае если поле нулл и в случае если там "честная" пустая строка.
← →
Anatoly Podgoretsky © (2008-07-01 23:50) [103]> Поросенок Винни-Пух (01.07.2008 23:25:42) [102]
> на клиенте в результате чтения строки из поля будет все равно пустая строка. И в случае если поле нулл и в случае если там "честная" пустая строка.
С тобой сложно согласиться, это может быть (в большинстве случаев) вариант, а он имеет понятие об Null
← →
Поросенок Винни-Пух © (2008-07-01 23:52) [104]вот только юлить не надо.
говорим про тип string, а не про вариант, у которого как раз есть значение нулл.
← →
Anatoly Podgoretsky © (2008-07-02 00:00) [105]> Поросенок Винни-Пух (01.07.2008 23:52:44) [104]
Какое юлить, ты напрасно думаешь, что я рот раскрыл не подумав.
TField.Value: variant;
Остальные типы, это обертки-преобразователи из этого и доступны для постоянных полей или через приведение, в основе все равно variant
← →
Поросенок Винни-Пух © (2008-07-02 00:05) [106]и чего?
даже если с полем работаем чепрез варианты, то все равно в "конечной точке" использования значения (отчет или еще что) будет либо vartostr(variantvalue) либо неявное приведение.
и вариантный нулл превратится в пустую строку.
в обоих случаях (в поле нулл и в поле пустая строка)
и чего теперь?
← →
McSimm © (2008-07-02 00:22) [107]
> Неинициализированное значение типа на сервере это нулл.
> Неинициализированное строковое значение в delphi это пустая
> строка.
И то и то неверно. На сервере это значение по умолчанию, иногда NULL.
В Delphi это неопределенное (произволное) значение, даже если кто-то привык находить там пустую строку.
> а в желании отличать на сервере нул от пустой строки смысла
> еще меньше.
Если эту разницу игнорировать, будут проблемы
← →
Поросенок Винни-Пух © (2008-07-02 00:24) [108]И то и то неверно. На сервере это значение по умолчанию, иногда NULL.
В Delphi это неопределенное (произволное) значение, даже если кто-то привык находить там пустую строку.
а там можно что-то иное найти?
научишь?
← →
Поросенок Винни-Пух © (2008-07-02 00:27) [109]Если эту разницу игнорировать, будут проблемы
расскажи мне про разнцу между двумя строками (и как ты её не игнорируешь):
field1.Clear;
field2.AsString := "";
str1 := field1.AsString;
str2 := field2.AsString;
← →
McSimm © (2008-07-02 00:29) [110]Про сервер фраза была.
← →
Поросенок Винни-Пух © (2008-07-02 00:34) [111]ой, ладно, завязываю с этим.
всем давно понятно, что вопрос просто религиозный.
когда начал работать с базами, и узнал, что нулл и пустая строка это разные вещи - удивился, принял на веру и привык.
когда перешел на оракл, и узнал, что там это одно и тоже, удивился, принял на веру и привык.
вот и все.
← →
McSimm © (2008-07-02 00:38) [112]
> а там можно что-то иное найти?
> научишь?
У меня нет Delphi очень давно, я не помню.
Возможно SetLength для локального динамического массива строк при неоднократных вызовах функции.
Достаточно информации от разработчиков. Инициализация декларируется, если правильно помню, для полей класса. Для локальных переменных на стеке постоянно напоминают - осторожно, там может быть произвольное значение.
← →
Anatoly Podgoretsky © (2008-07-02 00:38) [113]> Поросенок Винни-Пух (02.07.2008 0:05:46) [106]
Вопрос стоял как отличить, пустая строка или NULL - вариант эту проблему решает. Кроме того IsNull применим и к TStringField.
В последнее время я уже почти не использую постоянных полей, а обращаюсь или через FieldByName или Fields[], а там уже вариант сразу.
Поэтому никакой проблемы с определением нет, в отличии от AsString или Value
Что теперь скажешь?
← →
Anatoly Podgoretsky © (2008-07-02 00:41) [114]> Поросенок Винни-Пух (02.07.2008 0:27:49) [109]
> field1.Clear;
> field2.AsString := "";
>
> str1 := field1.AsString;
> str2 := field2.AsString;
Очень просто
if Field1.IsNull then ...
if Field2.IsNull then ...
На серверной стороне в запросе where StrField IS NULL
← →
Поросенок Винни-Пух © (2008-07-02 00:44) [115]Что теперь скажешь?
<Цитата>
я уже запарилсо повторять, что ваш вариант всего лишь универсальный контейнер для разных типов.
а терминах реальных предметных областей требуются строки и числа.
если в таблице у васи в отчестве записан нулл, а у пети пустая строка, то в отчете в лэйбл попадет пустая строка в обоих случаях.
и пляски мы начали с того, что пустая строка это совершенно особое значение строкового типа, а не вариантного!
И эта особенность этого значения позволяет ораклу использовать его в качестве нул значения строкового типа!
← →
Anatoly Podgoretsky © (2008-07-02 00:45) [116]> Поросенок Винни-Пух (02.07.2008 0:34:51) [111]
Не надо принимать на веру, это путь ламера, а не самурая.
← →
McSimm © (2008-07-02 00:46) [117]Особое значение для Oracle - да. Является признаком NULL
Для строкового типа - нет. Обычная строка, только короткая :)
← →
Anatoly Podgoretsky © (2008-07-02 00:47) [118]> McSimm (02.07.2008 0:38:52) [112]
Максим это напоминание не относится к объектам с контролируем сроком жизни, с автоматическим подсчетом ссылок. Иначе бы конструкция
S := 5
приводила бы к краху программы, а то и системы, для 98 система точно бы рухнула.
← →
McSimm © (2008-07-02 00:48) [119]а если string[10] ?
← →
Поросенок Винни-Пух © (2008-07-02 00:49) [120]Очень просто
if Field1.IsNull then ...
if Field2.IsNull then ...
а чо без продолжения то?
if Field1.IsNull then Result := "" else Result := Field1.AsString?
И что там мы, чоткие самураи, а не ламеры получим на выходе при "" и нулл?
← →
Anatoly Podgoretsky © (2008-07-02 00:50) [121]> Поросенок Винни-Пух (02.07.2008 0:44:55) [115]
В программу попадет NULL и не NULL
А в отчет попадет, то что будет сделано в твоей логике, например для NULL попадет "Не указано", для пустых строк ""
Тебя Борланд купил за колбасные обрезки своим AsString и я не удивлюсь, что ты использует TAdoQuery/TAdoTable
← →
Поросенок Винни-Пух © (2008-07-02 00:51) [122]Особое значение для Oracle - да. Является признаком NULL
Для строкового типа - нет. Обычная строка, только короткая :)
Так покажите мне нулл строку, неравную "".
И уверую.
← →
McSimm © (2008-07-02 00:53) [123]
> Так покажите мне нулл строку, неравную "".
> И уверую.
не в оракле:
select null="";
select count(field) = count(*)
и т.п.
← →
Поросенок Винни-Пух © (2008-07-02 00:54) [124]Тебя Борланд купил за колбасные обрезки своим AsString и я не удивлюсь, что ты использует TAdoQuery/TAdoTable
да я вообще в тумбочке сплю, а щи лаптем хлебаю.
← →
Поросенок Винни-Пух © (2008-07-02 00:56) [125]McSimm © (02.07.08 00:53) [123]
> Так покажите мне нулл строку, неравную "".
> И уверую.
не в оракле:
select null="";
select count(field) = count(*)
и т.п.
Для тех кто на тракторе:
На клиенте покажите мне строку содержащую нулл, и отличную от пустой!!!!!!!!!!!!!!!
Вам позарез нужно отлияие на сервере. Зашибись, вы его получили.
Где это отличие на клиенте в двух строках, считанных с полей содержащих "" и нулл???
← →
McSimm © (2008-07-02 00:57) [126]строковый тип в Делфи и в БД разные.
Они и в Делфи разные бывают.
И не только строковые, ко всем относится
← →
McSimm © (2008-07-02 00:58) [127]
> Где это отличие на клиенте в двух строках, считанных с полей
> содержащих "" и нулл???
ровно там же, где отличие для int
← →
McSimm © (2008-07-02 01:01) [128]
> Где это отличие на клиенте в двух строках, считанных с полей
> содержащих "" и нулл???
А еще в результатах агрегирующих функций, в параметрах для SQL запросов и еще во многих-многих местах.
--
Я не против идеологии Оракл, ее надо знать, как и прочие, вот и все.
Но сути не меняет.
← →
Поросенок Винни-Пух © (2008-07-02 01:02) [129]ровно там же, где отличие для int
а пальцем показать
строковый тип в Делфи и в БД разные.
Они и в Делфи разные бывают.
И не только строковые, ко всем относится
Ну так и сказал бы прямо: "в делфи я не отличаю пустую строку от нулл строки потому что нулл строки там просто нет. но я привык что на серверах, с которыми я работал это разные вещи, и только поэтому я считаю, что так и должно быть"
← →
Юрий © (2008-07-02 01:02) [130]Всё болтаете и болтаете... ерундой. :)
Лучше бы dev запустили, с поддержкой старых клиентов, конечно.
← →
McSimm © (2008-07-02 01:05) [131]Демагогия какая-то :)
В Делфи я не отличаю ноль от нул, потому что нул-чисел там просто нет и т.п.
← →
McSimm © (2008-07-02 01:06) [132]
> Юрий © (02.07.08 01:02) [130]
Дык, он и запущен и к тому же с поддержкой старых клиентов :)
← →
Anatoly Podgoretsky © (2008-07-02 01:10) [133]> McSimm (02.07.2008 0:48:59) [119]
Там нет ссылок и там ничего не надо поэтому инициализировать, перераспределять размер, перемещать в памяти, это ничем не отличается от скаляра, по сути обычный статический массив, у которого нулевой элемент содержит длину.
Поэтому там можно писать
S:="5";
S:="A";
как в обычный массив, когда для AnsiString
S1:="5"; создаст новую строку и установит счетчик в единицу
S2:=S1; увеличит счетчик у S1 и S2 на самом деле это одна и таже строк
S2:="A"; создаст другую строку, одновременно уменьшит счетчик на единицу у S1 и если он равен нулю то освободит всю память и присвоит nil S1
или
S1:="B"; создаст новую строку, скопировав туда значение, у S2 и S1 счетчик уменьшит на единицу и далее это уже две разные строки, живущие своей независимой жизнью, при выходе из области видимости счетчики будут уменьшены на единицу, при равенстве счетчика нулю память будет освобждена, переменным будет присвоен nil
← →
Поросенок Винни-Пух © (2008-07-02 01:13) [134]просто рогами уперлись с самого начала. а суть на поверхности лежит и лежала.
стандарт требует наличия для всех типов специальных значений (нулл), отличных от всех допустимых для типа.
в числовом диапазоне все числа это числа. каждое может представлять значение. правильно. делаем для поля флаг для индикации нула.
для строк пустая строка в силу своих свойств может служить таким спец значением. и служит. а некоторые и для нее сделали флаг.
и все.
а они спорят.
когда же просишь сказать сколько пустых строк я записал в стрим - сногозначительно молчат, начинают вилять и по англицки говорить.
типа мы умные.
умные, ага. тока не говорят сколько там в стриме пустых строк оказалось.
← →
Юрий © (2008-07-02 01:15) [135]> [132] McSimm © (02.07.08 01:06)
Зашёл в настройки клиента, поставил http://dev2.delphimaster.ru/
Перезагрузил клиента.
При загрузке "Прочего" получил: 500 Internal Server Error (ностальгия, не иначе) :)
PS. DMClient.
← →
Anatoly Podgoretsky © (2008-07-02 01:17) [136]> Поросенок Винни-Пух (02.07.2008 0:49:00) [120]
Не уходи от темы и не пытайся выкрутить, мы же не в песочнице, нам не требуется обязательно оказаться правым.
Я тебе привел пример/доказательствл, что я всегда для поля буду знать NULL или нет и выполнять логику программы в зависимости от этого - нет никакой разницы, твой код надо преобразовать в
if Field1.IsNull then Result := "Значение NULL"
else if Length(Field1.AsString) = 0 then Result := "пустая строка" else Result := "Строка имеет не пустое значение";
Как видишь все три состояния определены без особых усилий сугубо штатным средстами, по сути не отличающимися от запроса.
И если не использовать костыль Field1.AsString то можно использовать и методы работы с вариант, а не полем.
Ты учись пока я жив и есть желание делиться знаниями.
← →
Anatoly Podgoretsky © (2008-07-02 01:19) [137]> Поросенок Винни-Пух (02.07.2008 0:54:04) [124]
Хочешь отшутиться? Так я не шучу, но отвечать не обязан - это по вкусу, я просто пытаюсь понять чем и где, а может и кто, тебе испортили мозги и по возможности их поправить.
← →
Anatoly Podgoretsky © (2008-07-02 01:20) [138]> McSimm (02.07.2008 0:57:06) [126]
Минимум три, а с учетом некоторой допустимости и все пять.
← →
Поросенок Винни-Пух © (2008-07-02 01:23) [139]Я тебе привел пример/доказательствл, что я всегда для поля буду знать NULL или нет и выполнять логику программы в зависимости от этого - нет никакой разницы, твой код надо преобразовать в
речь про строковый тип и его особое значение "пустая строка".
меня не интересуют подпорки в виде методов IsNull и функций для работы с типом "вариант".
меня интересует тип "строка" и особое его значение ""
если это не ясно, то дискуссия закончена.
← →
McSimm © (2008-07-02 01:24) [140]
> когда же просишь сказать сколько пустых строк я записал
> в стрим - сногозначительно молчат, начинают вилять и по
> англицки говорить.
> типа мы умные.
> умные, ага. тока не говорят сколько там в стриме пустых
> строк оказалось.
А не пустых ?
К тому же если бы в стрим строки писал я, то я бы посчитал их без проблем независимо от значения.
> Юрий © (02.07.08 01:15) [135]
http://dev2.delphimaster.ru/forum/other/1178872139
← →
Поросенок Винни-Пух © (2008-07-02 01:26) [141]А не пустых ?
В ответ на неотвеченные простые вопросы не надо задавать свои.
Если хочешь честной дискуссии.
← →
Anatoly Podgoretsky © (2008-07-02 01:26) [142]> Поросенок Винни-Пух (02.07.2008 1:02:09) [129]
А чего показывать
I: Integer
ну и определи, где тут нуль. а вот Field.IsNull однозначно даст ответ, я же говорю, Борланд и его последователи мозги замусорили, я бы сказал грубее, но нельзя. А для теории БД нужны особые мозги и забыть все что ты знал в Дельфи ли другом языке, SQL это не функциональный язык и логика данных и их взаимоотношений совсем другие, мерки их других языков тут не применимы.
← →
Юрий © (2008-07-02 01:27) [143]> [140] McSimm © (02.07.08 01:24)
Спасибо! Поставлю две копии DMClient и зафлужу dev2. :о)
← →
Anatoly Podgoretsky © (2008-07-02 01:27) [144]> Поросенок Винни-Пух (02.07.2008 1:13:14) [134]
Это не стандарт требует а теория реляционных баз данных, не уверен для других баз, наверно тоже + их особенности.
← →
Поросенок Винни-Пух © (2008-07-02 01:30) [145]"бла бла бла, я очень умный и старый, а ты ничего не знаешь"
Борланд и его последователи мозги замусорили
берем с++ не от борланда.
нарисуйте мне строку, содержащую нулл. так что бы это была не пустая строка.
← →
Поросенок Винни-Пух © (2008-07-02 01:34) [146]Это не стандарт требует а теория реляционных баз данных
Хотел было попросить ссылку на теорию реляционных баз, где бы что-то говорилось про то, что пустая строка не может служить нуллом. Но передумал. Один фиг никто не покажет.
← →
Поросенок Винни-Пух © (2008-07-02 01:40) [147]I: Integer
ну и определи, где тут нуль
Читать у меня выше про то, что весь диапазон целочисленного типа это равноправные значения. ни одно не может служить нулом.
поэтому нужен нул-флаг для поля в бд и нужна проверка поля на клиенте.
← →
McSimm © (2008-07-02 01:42) [148]
> В ответ на неотвеченные простые вопросы
отвечал неоднократно :)
ладно, еще разок - в буфере (стриме) находится ровно одна строка (пустая или нет). Сколько раз туда производилась запись - узнать нельзя и не имеет смысла.
Теперь можно?
в буфере N байт кашеобразной информации, сколько непустых строк туда было добавлено? :)
← →
Поросенок Винни-Пух © (2008-07-02 01:46) [149]узнать нельзя и не имеет смысла.
ну если с пустой строкой нельзя, а со строкой "блабла" и любой другой строкой - можно, то делаем вывод, что пустая строка и любая другая строка - это очень большая разница.
и что пустая строка может служить нул-значением для строкового типа.
← →
Поросенок Винни-Пух © (2008-07-02 01:48) [150]в буфере N байт кашеобразной информации, сколько непустых строк туда было добавлено? :)
Не знаю.
И вопрос к теме не относится.
Я говорил, что все строки в опыте строго определены.
И что они записываются в буфер и что надо определить сколько туда их было записано.
← →
McSimm © (2008-07-02 01:48) [151]
> где бы что-то говорилось про то, что пустая строка не может
> служить нуллом.
примерами могу помочь. Уже приводил, вот еще
"" = "";
null != null;
Зачем доказывать то, чего нет?
В общем случае это разные вещи. Знать полезно и особенности Оракл и прочих.
Отрицать из принципа или по религиозным соображеним разницу между пустой строкой и пустым полем - опасно, т.к. работать правильно не будет.
← →
Поросенок Винни-Пух © (2008-07-02 01:51) [152]> где бы что-то говорилось про то, что пустая строка не может
> служить нуллом.
примерами могу помочь. Уже приводил, вот еще
"" = "";
null != null;
Зашибись пример.
пусто равно пусто как раз в силу того, что где-то пусто не используется как нулл.
← →
McSimm © (2008-07-02 01:51) [153]
> Я говорил, что все строки в опыте строго определены.
> И что они записываются в буфер и что надо определить сколько
> туда их было записано.
Можно и так. Хоть и никакой это не опыт, а словоблудие по пятому кругу.
Пишутся только строки "ААА", "АА" и "А". Позарез надо узнать сколько раз к результирующей строке в буфере их добавляли.
← →
McSimm © (2008-07-02 01:53) [154]
> пусто равно пусто как раз в силу того, что где-то пусто
> не используется как нулл.
Да где-то не используется. Это где-то - везде кроме Оракл.
Закрываем глаза на этот факт и твердим свое лимпопо. Только программы не работают почему-то.
← →
Поросенок Винни-Пух © (2008-07-02 01:57) [155]Можно и так. Хоть и никакой это не опыт, а словоблудие по пятому кругу.
словоблудие а не опыт?
у тебя словоблудие, а у меня опыт.
хочешь пришлю два файла?
for i := 1 to X do writebuff("привет_словоблуду")
for i := 1 to Y do writebuff("")
определи X и Y
Если ты не словоблуд, то сразу бы признал, что x определить можно, а Y нельзя.
И все.
И трепа бы не было.
Но нет же.
Мы мля щас всей компанией покажем новому нику, кто здесь гуру на самом деле.
И понеслась.....
← →
Поросенок Винни-Пух © (2008-07-02 01:58) [156]Закрываем глаза на этот факт и твердим свое лимпопо. Только программы не работают почему-то.
мои как раз работают
← →
McSimm © (2008-07-02 01:58) [157]
> x определить можно, а Y нельзя.
определить можно, выводов делать из этого нельзя.
← →
McSimm © (2008-07-02 01:59) [158]
> мои как раз работают
и в них во всех "" <> "" :)
← →
Поросенок Винни-Пух © (2008-07-02 01:59) [159]ну так определи, щас пришлю.
← →
McSimm © (2008-07-02 02:09) [160]да, отвык я от форумов за год...
X определить можно, Y определить нельзя. И означает это чуть меньше чем ничего (с)
← →
pasha_golub © (2008-07-02 03:42) [161]извините, мужики, не читал много постов. Вспомнилось. Писалась тулзовина, что доставала объекты и выводила всяко разно. Так вот комментарии об объектах хранились в таблице. Так там НУЛЛ и пустая строка таки разная весчь. Это ведь уже не сад-самострой, а системный каталог.
← →
pasha_golub © (2008-07-02 04:07) [162]Фух, прочитал блин.
Разрешите пьяному подростку.
Рассмотрим моноид относительно операции "конкатенация". Для этого рассмотрим непустое множество с заданой на нем операцией "конкатенация".
Множество G = {a1a2...an | ai = "", "a", "b", ... "z"}
Операция "+" замкнута на множестве G. "для любого p, q из G => p+q тоже из G"
Имеем нейтральный элемент относительно операции "+", такой что для любого p из G справедливо p+"" = ""+p = p
А вот NULL не содержится в данном множестве. Точно так же как не содержится он в множестве целых и вещественных чисел, булевых значений и прочее.
Это все равно что попробовать сложить 2 яблока со сферическим конем в вакууме.
Я задавал вопрос трижды. Чем "ноль" не такой специфический, что не может служить аналогом NULL в целочисленных вариациях?
← →
Anatoly Podgoretsky © (2008-07-02 08:57) [163]> Юрий (02.07.2008 1:27:23) [143]
Естествоиспытатели очень нужны на данном этапе.
← →
Anatoly Podgoretsky © (2008-07-02 09:02) [164]> McSimm (02.07.2008 1:48:31) [151]
Ох зря ты это привел, от этого же мозги закипят у неподготовленых людей.
← →
Поросенок Винни-Пух © (2008-07-02 09:25) [165]X определить можно, Y определить нельзя. И означает это чуть меньше чем ничего (с)
Это означает, что это единственное значение, которое невозможно посчитать не определено или его не существует. Это и есть null.
← →
Игорь Шевченко © (2008-07-02 09:48) [166]Поклонников чистой теории - давить!
← →
Поросенок Винни-Пух © (2008-07-02 09:56) [167]Я задавал вопрос трижды. Чем "ноль" не такой специфический, что не может служить аналогом NULL в целочисленных вариациях?
я тебе трижды и отвечал. ноль это точно такое же значение целочисленного типа как и любое другое. нулл же это неопределенное значение.
берем любой целочисленный тип. что видим? что у него фиксированный размер. и какой бы комбинацией битов не заполнить этот размер, всегда будет валидное целочисленное значение. это не нулл.
← →
McSimm © (2008-07-02 10:12) [168]
> pasha_golub © (02.07.08 04:07) [162]
ноль действительно в такой же степени особен как и пустая строка, просто на практике со строками эта разница между "неизвестно" и ноль реже востребована, чем с числами, датами и пр.
← →
McSimm © (2008-07-02 10:16) [169]
> я тебе трижды и отвечал. ноль это точно такое же...
и что? и вам неоднократно отвечали, что пустая строка это точно такое же...
Это всего лишь ваше мнение, с которым не все согласны. Все нормально, давайте на этом и прекратим заполнять буферы битами.
← →
Поросенок Винни-Пух © (2008-07-02 10:18) [170]ноль если мы говорим не об математической абстракции, а о типах данных sql сервера это определенное количество байт отичное от нуля.
Этим ноль и отличается от пустой строки, которую ты никак не можешь посчитать. Я твои ноли в стриме посчитаю и скажу сколько их.
Потому что это значение и его можно обнаружить.
А пустая строка это отстутвие значения или неопределенное значение.
Это и есть нулл в чистом виде.
← →
Поросенок Винни-Пух © (2008-07-02 10:19) [171]и что? и вам неоднократно отвечали, что пустая строка это точно такое же...
ты просто докажи что точно такое же.
пока ты только мелешь языком вторые сутки.
← →
McSimm © (2008-07-02 10:31) [172]
> пока ты только мелешь языком вторые сутки.
не только, как ни странно, я при этом еще успеваю много делать. но вы правы, завязывать надо.
Это я с непривычки так втянулся в глупый спор :)
Уговорили, признаю свою неправоту, пустая строка самая особенная из всех особенных строк. Особенно заметны ее особенности в задачах подсчета количества конкатенаций и при работе с некоторыми БД.
← →
isasa © (2008-07-02 11:52) [173]О как. Щас рэзать друг друга будуть.
:)
ORACLE
LENGTH("12345") -> 5
LENGTH("") -> NULL
LENGTH(NULL) -> NULL
MS SQL
LENGTH("12345") -> 5
LENGTH("") -> 0
LENGTH(NULL) -> NULL
Второе логичнее.
Кроме того в ORACLE как отличить пустую и "незаполненную".
Кстати, если вспомнить, что строка информационный векор, то все становится на места.
NULL - место под строку не выделено.
"" - место выделено, но длина вектора ноль,
ну и т.д.
← →
McSimm © (2008-07-02 11:57) [174]
> О как. Щас рэзать друг друга будуть.
Поздно, это все уже перетерли :)
> Второе логичнее.
> Кроме того в ORACLE как отличить пустую и "незаполненную".
Даже если второе и логичнее, штука в том, что в Оракл это просто инструмент со своими особенностями. Исходя из этого задачу всегда можно рассматривать таким образом, что отличать пустую строку от NULL просто не надо.
← →
Поросенок Винни-Пух © (2008-07-02 12:07) [175]Кроме того в ORACLE как отличить пустую и "незаполненную".
а как в делфи отличить пустую строку от "незаполненной"?
Кстати, если вспомнить, что строка информационный векор, то все становится на места.
NULL - место под строку не выделено.
где не выделено?
в таблице бд? выделно место под все поля записи иначе где у вас сам нулл-то живет?
"" - место выделено, но длина вектора ноль,
ну и т.д.
место выделено, но правда ни единого бита не выделено.
Ты говоришь что не выделено, а я говорю что миллион раз выделено по ноль байт.
есть метод определить что мой миллион раз не был выделен и что твой один раз был выделен? если длина выделенного ноль?
← →
Игорь Шевченко © (2008-07-02 12:15) [176]
> Кроме того в ORACLE как отличить пустую и "незаполненную".
А нафига их отличать ?
← →
McSimm © (2008-07-02 13:02) [177]
> а как в делфи отличить пустую строку от "незаполненной"?
Точно так же как и Int - никак.
Порочное сравнение. Типы данных могут называться одинаково, но суть разная.
В Oracle нет понятия пустая строка, в других системах - есть. Нет тут места религии, достаточно знаний инструмента :)
← →
McSimm © (2008-07-02 13:08) [178]
> А нафига их отличать ?
Возможно мелочи, но все-таки неудобства некоторые есть. Особенно ежели с непривычки.
Например композитные ключи вызывают навскидку вопросы, поиск по введенному значению (where field = %s - придется вводить специальный случай для пустой строки).
Иногда и логику пришлось бы адаптировать - например, есть у меня в одном месте поле пароля, пустой пароль допустим - пускает с этими правами без запроса, а когда NULL - значит пароль еще не был задан, требует от пользователя задать пароль при первом входе (может и пустой).
Разумеется это далеко не камни преткновения.
← →
Игорь Шевченко © (2008-07-02 13:19) [179]McSimm © (02.07.08 13:08) [178]
Я не про точку зрения программиста - сторонники чистой теории наверняка придумают массу аргументов, почему пустую строку от NULL нужно отличать в программах.
Я про другое - с точки зрения построения модели реального мира чем они отличаются и зачем их надо отличать ?
← →
umbra © (2008-07-02 13:26) [180]
> Я про другое - с точки зрения построения модели реального
> мира чем они отличаются и зачем их надо отличать ?
они отличаются тем, что NULL - это неизвестное, а пустая строка - известное значение.
← →
Игорь Шевченко © (2008-07-02 13:29) [181]umbra © (02.07.08 13:26) [180]
> они отличаются тем, что NULL - это неизвестное, а пустая
> строка - известное значение.
Ты можешь привести пример ? :)
← →
McSimm © (2008-07-02 13:31) [182]Модель на то и модель, при построении надо учитывать пространство, в котором она реализуется.
Можно так построить, а можно и так. И это ни разу не говорит о качестве модели. На примере выше с паролем: в одной модели невведеный пароль отличается от пустого с использованием множества значений, в другой это может быть обычный флаг.
← →
umbra © (2008-07-02 13:35) [183]на основе неизвестного невозможно принять решение
Например. Хочу купить себе читалку для книг на день рождения. Если я не знаю, будут ли у меня тогда деньги, то я не могу сказать, куплю я ее или нет. Если же я знаю, что денег не будет, то, соответственно, точно знаю, что не куплю.
← →
Игорь Шевченко © (2008-07-02 13:37) [184]umbra © (02.07.08 13:35) [183]
И где здесь пустая строка ?
McSimm © (02.07.08 13:31) [182]
> в одной модели невведеный пароль отличается от пустого с
> использованием множества значений, в другой это может быть
> обычный флаг.
Не совсем понял, о чем речь, не затруднит пояснить или дать ссылку на пост ?
← →
umbra © (2008-07-02 13:39) [185]
> И где здесь пустая строка ?
>
пустая строка - "я знаю, что денег не будет" :)
← →
Юрий © (2008-07-02 13:41) [186]> [143] Юрий © (02.07.08 01:27)
Поставил клиента, указал всё как нужно. Пытаюсь писать, ответ "Неверный пароль". Пароль верный. Пробовал изменять имя, не пашет. :)
← →
McSimm © (2008-07-02 13:50) [187]
> Не совсем понял, о чем речь, не затруднит пояснить или дать
> ссылку на пост ?
на девятой странице [178]
> Юрий © (02.07.08 13:41) [186]
Клиентский протокол не предусматривает отправку сообщений в принципе.
Все обсуждения на эту тему лучше проводить там.
← →
McSimm © (2008-07-02 13:52) [188]
> пустая строка - "я знаю, что денег не будет" :)
это не строка, это числовое выражение.
Суть в том, что строки в реальном мире действительно крайне редко требуют отличия пусто и неизвестно (при соответствующем подходе к моделированию :)), в отличие от других типов данных.
← →
umbra © (2008-07-02 13:59) [189]просто в реальном мире нет строк :)
← →
Игорь Шевченко © (2008-07-02 15:31) [190]McSimm © (02.07.08 13:50) [187]
C [178] согласен, что в данном случае следует отличать. Но это, опять же, не камень преткновения - "просто так смоделировали"
← →
Petr V. Abramov © (2008-07-02 20:01) [191]
> Игорь Шевченко © (02.07.08 13:29) [181]
допустим, есть таблица с PK по varchar, и у этого поля в силу каких-то соображений (каких, правда, не знаю :) может быть и значение "пустая строка". А потом на это поле сослались по FK. И в FK теперь неплохо бы отличать отсутствие ссылки куда-либо (null) от ссылки на запись "пустая строка".
P.S. в силу все же некоторой надуманности примера переделывать Oracle не пропагандирую :)
← →
Игорь Шевченко © (2008-07-02 20:13) [192]
> в силу все же некоторой надуманности примера
таких примеров и я могу привести - но это программизм, а не предметная область :)
← →
Petr V. Abramov © (2008-07-02 20:19) [193]
> Игорь Шевченко © (02.07.08 20:13) [192]
> но это программизм, а не предметная область :)
это предметная область. Представь себе, что такую сущность (с ID = <пустая строка>) ввели постановлением Единой России и Кабинета Министров. А то, что ключ по этому полю сделан - так то при царе было.
← →
Игорь Шевченко © (2008-07-02 20:20) [194]
> это предметная область.
предметная область в терминах ключей и таблиц не описывается.
← →
Petr V. Abramov © (2008-07-02 20:26) [195]
> Игорь Шевченко © (02.07.08 20:20) [194]
зато описывается в терминах существующих систем и высочайших постановлений, иначе это такая же теория, трехзначная логика :)
← →
Petr V. Abramov © (2008-07-02 20:27) [196]
> Petr V. Abramov © (02.07.08 20:26) [195] +
такая же теория, как трехзначная логика :)
← →
Petr V. Abramov © (2008-07-02 20:30) [197]
> Игорь Шевченко © (02.07.08 20:20) [194]
в описании предметной области и слова null нету тогда уж :)
← →
McSimm © (2008-07-02 20:47) [198]Даже постановлением ВЦСПС нельзя ввести сущности с каким-то ID :)
И, если не ошибаюсь, в PK не может быть null в принципе ?
← →
Anatoly Podgoretsky © (2008-07-03 00:10) [199]> McSimm (02.07.2008 20:47:18) [198]
А почему именно ПК
INNER JOIN ... A.id=B.id
← →
McSimm © (2008-07-03 00:12) [200]ПК в связи с примером из [191] и последующим его обсуждением
← →
Petr V. Abramov © (2008-07-03 14:28) [201]
> И, если не ошибаюсь, в PK не может быть null в принципе
> ?
null не может, а "пустая строка", если она не тождественна null - может.
хотя из описанной ситуации есть достойный житейский выход - вколотить туда пробел :)))
← →
McSimm © (2008-07-03 14:47) [202]так если пустая строка не тождественна, тогда и проблем с определением в связке не будет.
в данном случае (Оракл) - тождественна. Насколько я понял, единственное отличие от null - при использование в выражении ||
← →
Anatoly Podgoretsky © (2008-07-03 14:56) [203]> Petr V. Abramov (03.07.2008 14:28:21) [201]
А дальше - два, три и так далее.
← →
pasha_golub © (2008-07-03 15:55) [204]Хы, Петя хорошую штуку придумал.
А строка "" и " " идентичны?
ЗЫ Учтите, что кавычек нету. Сдедовательно визуально вы их отличить не сможете.
← →
McSimm © (2008-07-03 16:01) [205]Для char - да, идентичны :)
А вообще - смотря в каком смысле идентичны. Можно говорить и так и эдак и аргументы приводить.
Например, с ноября месяца по 26 апреля сего года в буфер не было записано ни единого значения.
← →
Anatoly Podgoretsky © (2008-07-03 16:29) [206]> pasha_golub (03.07.2008 15:55:24) [204]
Это большая загадка, если абстрактно то нет, но в жизни по разному. Например для varchar идентичны в сравнение, но различны как данные.
← →
pasha_golub © (2008-07-04 19:59) [207]А есить еще вариант с типом "множество". Пустое множество {} и NULL ведь разные вещи?
← →
Anatoly Podgoretsky © (2008-07-04 20:31) [208]> pasha_golub (04.07.2008 19:59:27) [207]
Нул в БД, нуль в вариант, нул в СИ это разные вещи.
Нул в БД не равен нул
Нул в вариант равен нул
Нул в СИ вообще не нул
← →
McSimm © (2008-07-04 20:41) [209]
> Пустое множество {} и NULL ведь разные вещи?
Вот с таким различием ни разу не сталкивался и фантазии не хватит, наверное.
Страницы: 1 2 3 4 5 6 вся ветка
Текущий архив: 2008.08.24;
Скачать: CL | DM;
Память: 1.07 MB
Время: 0.029 c