1

我通过 Borland 数据库引擎 (BDE) 使用 Paradox 表。

我无法实现在字符串字段(Paradox 数据类型“A”)中处理null空字符串值的方式。

我的具体问题是如何确定字段值是 null 还是空字符串。在数据库桌面工具中,它们似乎都是空字符串。

我需要这个,因为我正在将数据(使用 Database Desktop 以及以编程方式)迁移到 Firebird DB,并且似乎是空字符串的字段值都作为空值复制到 Firebird ...甚至属于索引的字段!如何区分真正的 null 和空字符串?它取决于 Paradox 还是 BDE?谢谢!

4

2 回答 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 实现允许一个与自身匹配并且可与 NULL 区分开来的 BLANK 数值,那么您的问题就会减少,因为您的数据库至少与 BDE 一样有能力。不过,您可能仍然无法使用内置的导入实用程序。

于 2012-11-08T04:40:12.327 回答
0

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');
于 2012-04-19T14:04:03.410 回答