我正在通过Borland数据库引擎(BDE)使用Paradox表。
我无法意识到在字符串字段中处理 null 和空字符串值的方式(Paradox数据类型“A”)。
我的具体问题是如何确定字段值是空还是空字符串。在Database Desktop工具中,它们似乎都是空字符串。
我需要这个,因为我正在将数据(使用Database Desktop以及编程方式)迁移到Firebird数据库,而字段值似乎是空字符串全部被复制到Firebird作为空值。 ..甚至属于索引的字段! 如何区分真空和空字符串?它取决于Paradox还是BDE?谢谢!
答案 0 :(得分:6)
如您所知,现代数据库实现包括“NULL”的概念,这是一个永远不会匹配任何其他值的值,甚至是另一个NULL。
BDE,它的祖先是Paradox引擎和Paradox for DOS,不包括NULL 的概念。 BDE表中的所有数据类型都不允许使用像NULL这样的排除值。
BDE 包含BLANK的概念,但这只是某些类型的特殊带内值。 BLANK与BLANK匹配,没有别的。在数字字段中,BLANK可区别于0,但在字段中,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一样强大。但是,您可能仍然无法使用内置导入实用程序。
答案 1 :(得分: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');