Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.24;
Скачать: CL | DM;

Вниз

Отождествление пустой строки и NULL   Найти похожие ветки 

 
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?

И что там мы, чоткие самураи, а не ламеры получим на выходе при "" и нулл?



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

Текущий архив: 2008.08.24;
Скачать: CL | DM;

Наверх




Память: 0.71 MB
Время: 0.041 c
2-1216372224
programmer90
2008-07-18 13:10
2008.08.24
Как притормозить выполнение след. оператора


15-1215091161
VingtQuatrieme
2008-07-03 17:19
2008.08.24
Начальник Чукотки ушёл.


4-1194784856
Niki
2007-11-11 15:40
2008.08.24
LBN_SELCHANGE


2-1216296933
Dmitry87
2008-07-17 16:15
2008.08.24
Быстродействие алгоритмов


3-1204215439
slimer
2008-02-28 19:17
2008.08.24
Обрыв соединения с MySQL сервером