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 和空值?的主要内容,如果未能解决你的问题,请参考以下文章