VFP9中新的数据类型是如何影响DBF文件的

VFP9中新的数据类型是如何影响DBF文件的,第1张

VFP9中新的数据类型是如何影响DBF文件的,第2张

新的数据类型如何影响DBF文件?

您可能对VFP如何在表中实现这些新的数据类型感兴趣。DBF结构不允许变长字段,所以实际上DBF表中的Varchar和Varbinary字段实际上是用upper 空格填充的。因此,微软有一种机制来跟踪Varchar和Varbinary字段的长度,以确保在需要时返回正确的修整值。它是这样工作的:

×在VFP所有版本的DBF表中,如果其中一个字段可以接受空值,那么一个名为_NullFlags的隐藏字段将被添加到该表中。该字段包含一个位值,用于指示指定记录中的特定字段是否包含空值。例如,如果可以接收null的记录中的第一个字段包含null,那么_NullFlags中的位0被设置为1。如果可以接收空值的第二个字段包含非空值,则in _NullFlags中的位1被设置为0。因为一个字节中有8位,所以对于可以接收空值的字段的数量,in _NullFlag中的值的宽度是8。

在VFP 9中,_NullFlags有两个作用:它的位还指示Varchar和Varbinary字段中的值是否填充字段。如果某个位包含0,则字段中值的长度等于该字段的长度(该字段已满)。如果该位包含1,则该值的长度小于该字段的长度。在这种情况下,该字段将根据需要填充空,最后一位包含字段的长度。比如一个包含“AB”的10位Varchar字段,实际上包含“AB”后跟7 空个单元格,再加上一个CHR(2)(2代表值的长度),这个字段的位在_NullsFlags中为1。

×如果一个字段可以接收空值,并且是Varchar或Varbinary类型,它将用两位表示。低的代表“满”状态,高的代表空状态。例如,一个可以接受null的10位Varchar字段包含“AB”,在_NullFlags中用01表示(0表示不为null,1表示不满足),而同一字段中的null值用11表示(null和不满足)。

下面的示例演示了_NullFlags在字符类型中使用时的各种值,这些字符类型可以接受null (Field3)、非null Varchar(Field2)和可为null的Varchar字段(Field4)。位0表示字段2的完整状态,位1包含字段3的空状态,位2包含字段4的完整状态,位3包含字段4的空状态。这个例子使用了VFP自带的HexEdit工具来显示DBF文件中的二进制内容。滚动到地址000001C0,查看表中这七条记录的内容。

创建表TestVarchar(字段1 C(1),字段2 V(1),字段3 C(1) null,;field 4v(1)null)insert into TestVarchar值(' A ',' A ',' A ',' A ')&& Record 20 41 41 41 41 41,_ null flags 0000000 = 00 insert into TestVarchar值(' A ','',' A ',' A ',' A ')& & Record 20 41 00 41 41 41,_ null flags 00000001 = 01 insert into TestVarchar值(' A ',' A ',' A ',' ')& & Record 20 41 41 41 41 _ NULL flags 00000010 = 02 insert into TestVarchar values(' A ',' A ',' A ',. NULL.) && Record 20 41 41 41 00,_ NULL flags 00001100 = 0C insert into TestVarchar values(' A ',' A ',. NULL .,. NULL.) && Record 20 41 41 20 00,_ null flags 00001110 = 0E insert into TestVarchar values(' A ','',. null .,. null .)。

(在代码的注释中,记录开头的20表示记录没有被删除,41是字母“A”,00表示Varchar字段中的值长度为0字节,因为字段是空或null,而字符字段中的20是空单元格,表示字段是/[/]。)

Blob不会影响DBF文件的结构,因为它们将存储在一个FPT文件中,使用与通常的Memo字段相同的格式。福克斯俱乐部

DBF的另一个变化是:如果一个表包含这些新数据类型中的任何一种,指示表类型的第一位将包含0x32(十进制类型的50)(可以使用SYS(2029)返回这个值)。因此,你不能在过去版本的VFP或用VFP ODBC驱动程序打开这个表。

二元索引

VFP程序员经常基于DELETED()函数建立索引。这个标签可以被Rushmore优化,因为VFP不需要大量的磁盘访问来确定哪些记录被删除了;从索引中查找很容易,看起来就像从内存中的缓存中查找一样(然而,在某些情况下,这样的索引实际上可能会降低VFP的速度。详情请见Chris Probst在FoxPro Advisor 1999年5月刊上的文章。FoxPro Wiki上也有几个关于这个问题的话题;http://fox.wikis.com).

因为基于DELETED()或其他逻辑表达式的索引只能包含两个值(. t .或。微软发现他们可以改变这种索引在CDX文件中的存储方式,从而产生更小更快的索引。因此,VFP 9有一个新的索引类型:二进制。

要构建二进制索引,请将BINARY关键字添加到INDEX命令中。例如:

DELETED()标记上的索引已删除二进制文件

以下是二进制索引的一些详细信息:

x二进制索引可能是比普通索引小得多的东西,所以它要快得多。TestBinaryIndex。PRG建立了一个表,表中分别建立了一个普通索引和一个基于DELETED()的二进制索引。二进制索引比普通索引快90%。

x二进制索引的目的是Rushmore优化。你不能寻求他们或设定秩序。

×逻辑表达式的运算结果永远不能为null,无论是索引建立的时候,还是以后使用表的时候,否则都会出错。

×在INDEX命令中不能使用FOR、ASCENDING、DESCENDING、UNIQUE或CANDIDATE子句,并且在创建二进制索引时不能创建IDX索引文件。

×根据VFP帮助(“Visual FoxPro Index Types”主题),VFP会根据返回的记录数是冗余的还是少于总记录数的3%,更快或更慢地为一个二进制索引构建Rushmore优化位图。简而言之,这个限制由几个事实决定,包括记录的总数。在许多情况下,您需要在实际条件下进行测试,以确定二进制索引将如何影响您的查询。另一个VFP帮助主题“基于已删除记录的索引”提供了有关如何在各种条件下优化VFP的更多信息。

摘要

VFP 9中添加的新数据类型使得使用SQL Server等非本地数据库比以往任何时候都更容易,而且在本地表中使用它们也非常有用。如果您需要在常规字段中存储图像,Blob字段尤其有用。二进制索引可以提高SQL SELECT语句的性能,即使VFP过去一直在加速。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » VFP9中新的数据类型是如何影响DBF文件的

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情