Paradox 如何管理 null 和空值?

Posted

技术标签:

【中文标题】Paradox 如何管理 null 和空值?【英文标题】:How does Paradox manage null and empty values? 【发布时间】:2012-04-19 12:30:53 【问题描述】:

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

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

我的具体问题是如何确定字段值是空字符串还是空字符串。在 Database Desktop 工具中,它们似乎都是空字符串。

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

【问题讨论】:

我不明白你所说的“甚至属于索引的字段!” @MarkRotteveel 属于 Paradox 中的索引(并且属于 Firebird 中的主键)的字段不应为空。但它们会按原样迁移... Firebird 中的复合唯一键(但不是主键)可以包含 NULL,请参阅 firebirdsql.org/manual/nullguide-keys.html @MarkRotteveel 是的,但是在我的迁移中,这些字段将成为主键的一部分(对不起,如果我没有提到它)。 【参考方案1】:

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 一样强大。不过,您可能仍然无法使用内置的导入实用程序。

【讨论】:

【参考方案2】:

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');

【讨论】:

以上是关于Paradox 如何管理 null 和空值?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 中NULL和空值的区别

MySQL 中NULL和空值的区别

select2 - 如何允许空值

c# 8.0 switch 表达式返回类型和空值

如何在流分析组中将多条记录与字符串和空值合并

与 SQL 排序依据和空值的数据库一致性