Как Paradox управляет нулевыми и пустыми значениями?

Я использую таблицы Paradox через Borland Database Engine (BDE).

Я не могу понять, как значения null и пустая строка обрабатываются в строковых полях (тип данных Paradox "A").

Моя конкретная проблема заключается в том, как определить, является ли значение поля нулевым или пустой строкой. В инструменте Database Desktop все они кажутся пустыми строками.

Мне это нужно, потому что я переношу данные (с помощью Database Desktop, а также программно) в БД Firebird, и значения полей, которые кажутся пустыми строками, копируются в Firebird как нулевые значения... Даже поля, принадлежащие индексу! Как отличить настоящий null от пустых строк? Это зависит от Paradox или BDE? Спасибо!


person bluish    schedule 19.04.2012    source источник
comment
Я не понимаю, что вы с «Даже поля, принадлежащие индексу!»   -  person Mark Rotteveel    schedule 19.04.2012
comment
@MarkRotteveel Поля, принадлежащие индексу в Paradox (и принадлежащие первичному ключу в Firebird), не должны быть нулевыми ... но они переносятся как были ...   -  person bluish    schedule 20.04.2012
comment
Составные уникальные ключи (но не первичные) в Firebird могут содержать NULL, см. firebirdsql.org/manual/nullguide-keys.html   -  person Mark Rotteveel    schedule 21.04.2012
comment
@MarkRotteveel да, но в моей миграции такие поля станут частью первичного ключа (извините, если я не упомянул об этом).   -  person bluish    schedule 23.04.2012


Ответы (2)


BLANK as NULL считается вредным

Как вы знаете, современные реализации баз данных включают понятие "NULL", которое представляет собой значение, которое никогда не совпадает ни с каким другим значением, даже с другим NULL.

BDE и его предшественники, движок Paradox и Paradox для DOS, не включают концепцию NULL. Ни один из типов данных в таблице BDE не допускает исключающее значение, такое как NULL.

BDE включает понятие BLANK, но это просто специальное внутриполосное значение для некоторых типов. BLANK соответствует BLANK и ничему другому. В числовом поле BLANK можно отличить от 0, но в альфа-поле BLANK идентичен строке нулевой длины.

По-видимому, когда-то в смутном прошлом кому-то поручили создать утилиту для импорта из таблиц BDE в базу данных SQL, и он не совсем справился с этим. Вероятно, он не мог представить себе базу данных без NULL, поэтому предположил, что BLANK — это то же самое, что NULL. С тех пор все остальные просто последовали его примеру.

Преобразование BDE BLANK в SQL NULL неверно. Это изменяет архитектуру базы данных и ломает архитектуру любых связанных приложений. Данные, импортированные из таблицы BDE, никогда не должны содержать NULL.

Либо напишите свою собственную процедуру импорта, либо используйте встроенный импорт, а затем тщательно обработайте импортированные данные, чтобы преобразовать все значения NULL в другие значения.

ПУСТЫЕ альфа-значения должны быть преобразованы в значения CHAR или VARCHAR нулевой длины.

ПУСТЫЕ числовые значения должны быть преобразованы в выбранное значение внутриполосного флага, которое соответствует самому себе. Возможно, вам придется зарезервировать специальное значение для представления BDE BLANK, если только NaN или что-то подобное нельзя заставить работать. Во многих случаях, в зависимости от архитектуры приложения, вы сможете преобразовать BDE BLANK в SQL 0.

Конечно, если ваша реализация SQL допускает пустое числовое значение, совпадающее с самим собой и отличающееся от NULL, то ваши проблемы уменьшаются, потому что ваша база данных не уступает по возможностям BDE. Однако вы, вероятно, все еще не можете использовать встроенную утилиту импорта.

person A. I. Breveleri    schedule 08.11.2012

Пример SQL:

select customer_id from customer
where (customer_addr is null) -- string null
   or (customer_addr = '')    -- string is empty

Пример Делфи:

if (query1customer_addr.AsVariant = NULL) // string null
  or (query1customer_addr.AsString = '')  // string is empty
then ShowMessage('Null or Empty');
person Nelson H C Nepomuceno    schedule 19.04.2012