Paradox如何处理null和empty值?

3
我正在使用Borland Database Engine(BDE)通过Paradox表格进行操作。
我无法理解在字符串字段中(Paradox数据类型“A”),null和空字符串的处理方式。
我的具体问题是如何确定一个字段值是null还是空字符串。在Database Desktop工具中,它们似乎都是空字符串。
我需要这个信息,因为我正在将数据迁移到Firebird DB(通过Database Desktop和编程方式),看起来为空字符串的字段值被复制到Firebird中作为null值...即使是属于索引的字段!我该如何区分真正的null和空字符串?这取决于Paradox还是BDE?谢谢!

我不明白你说的“Even fields belonging to an index!”是什么意思。 - Mark Rotteveel
@MarkRotteveel Paradox中索引所属的字段(以及Firebird中主键所属的字段)不应为空,但它们被迁移时仍然为空。 - bluish
Firebird中的复合唯一键(但非主键)可以包含NULL,请参见http://www.firebirdsql.org/manual/nullguide-keys.html。 - Mark Rotteveel
@MarkRotteveel 是的,但在我的迁移中,这些字段将成为主键的一部分(如果我没有提到,我很抱歉)。 - bluish
2个回答

7

将BLANK视为NULL是有害的

现代数据库实现中包括“NULL”的概念,它是一个永远不会与任何其他值匹配的值,甚至不与另一个NULL匹配。

BDE及其祖先Paradox引擎和Paradox for DOS 不包括NULL的概念。BDE表中的任何数据类型都不允许使用类似NULL的排除性值。

BDE 包括BLANK的概念,但这只是某些类型的特殊内部值。BLANK仅与BLANK匹配,不与其他任何值匹配。在数字字段中,BLANK可与0区分,但在alpha字段中,BLANK等同于零长度字符串。

显然,在过去的某个时候,有人负责创建一个实用程序,以从BDE表导入到SQL数据库中,但他并没有完全理解。他可能无法想象没有NULL的数据库,因此他猜测BLANK与NULL相同。从那时起,其他人就一直跟随他的步伐。

将BDE BLANK转换为SQL NULL是错误的。这样做会改变数据库的架构,并破坏任何相关应用程序的架构。从BDE表导入的数据不应该包含NULL。

要么编写自己的导入过程,要么使用内置的导入,然后仔细后处理导入的数据,将所有NULL转换为其他值。

BLANK alpha值必须转换为零长度的CHAR或VARCHAR值。

BLANK数字值必须转换为所选的内部标志值,该值与其自身匹配。您可能需要保留一个特殊值来表示BDE BLANK,除非可以使用NaN或某些类似的值。在许多情况下,根据应用程序架构,您将能够将BDE BLANK转换为SQL 0。

当然,如果您的SQL实现允许一个BLANK数字值,它可以与自身匹配并且可与NULL区分,则您的问题会减少,因为您的数据库至少与BDE一样有能力。但是,您可能仍然无法使用内置的导入实用程序。


0

SQL 示例:

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

Delphi 示例:

if (query1customer_addr.AsVariant = NULL) // string null
  or (query1customer_addr.AsString = '')  // string is empty
then ShowMessage('Null or Empty');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接