VFP字段Varbinary 的特性,不进行代码页转换意味着什么?

来源:What’s New In NineVisual FoxPro’s Last Hits
译者: Fbilo

Varbinary 是一个真正新的数据类型:它包含二进制值。象 Varchar 一样,Varbinary 字段没有被加上空格直到达到字段的最大长度。Microsoft 处于跟 Varchar 同样的理由为 VFP 增加了 Varbinary:更好的支持其它数据库。不过,它们也可以在 VFP 本地表中用于象时间戳、或者 GUID 这样的二进制值。Varbinary 的单字符缩写是“Q”。

被储存在 Varbinary 字段中的值使用一个新的记号:0h(一个零后面跟着字母“h”),后面跟着一系列的十六进制值。这个值不需要用引号括起来。这里是从 TestVarbinary.PRG 中拿来的一个示例,它演示了 Varbinary 的用法:

create cursor Test (Field1 Q(20))
insert into Test values (0h466F7820526F636B73)
&& 字符串 “Fox Rocks” 的二进制表示
? vartype(Field1) && 显示 “Q”
? len(Field1) && 显示 9
? Field1 && 显示 0h466F7820526F636B73
这里是关于 Varbinary 的一些细节:
Varbinary 有着跟 Varchar 类似的功能:你可以建立基于它的索引(由于索引的键必须是固定长度的,所以将被填补空格到字段的长度),它接受 null 值,而且在一个表或者游标中的 Varbinary 字段有着 254 个字符的长度限制。
2.3 Varbinary 跟 Varchar 的区别是:MACHINE 是在 Varbinary 字段上建立索引时唯一允许的排序顺序;使用别的顺序会导致一个“invalid collation sequence”(无效的排序顺序)错误。

另一个区别是 SQL LIKE 操作符以及 LIKE()、LIKEC()、BINTOC()、CTOBIN() 函数是不允许使用在 Varbinary 值上的。

你可以根据一个 Varbinary 字段的二进制或者字符表达式进行 SEEK()。例如,SEEK 0h466F7820526F636B73 跟 SEEK ‘Fox Rocks’ 将找到同一条记录。

在 Varbinary 字段上不会执行代码页转换,因此表设计器中没有 Varbinary(Binary)的选择,在 CREATE TABLE/CURSOR 命令中也不需要 NOCPTRANS。

TYPE() 和 VARTYPE() 会为 Varbinary 字段和存储在内存变量中的 Varbinary 值返回“Q”。

串联 Varbinary 和 Character(或者 Varchar)值产生的结果,其数据类型是第一个值的数据类型。例如,继续前面示例中的代码:

? “It’s true that " + Field1 && 显示 “It’s true that Fox Rocks”
? Field1 + " tonight” && 显示 0h466F7820526F636B7320746F6E69676874
你可以使用这个行为特性来在字符和Varbinary之间进行转换。下面代码中的第一行将Varbinary转换成字符,而第二行则将字符转换成Varbinary:

? ‘’ + 0h466F7820526F636B73 && 显示 “Fox Rocks”
? substr(0h00 + “Fox Rocks”, 2) && 显示 0h466F7820526F636B73
当然,你也可以使用在本书第14章“语言的增强”中讨论的新 CAST() 函数来在 Character 和 Varbinary 之间进行转换。

字符型一样,Varbinary 值们之间的比较对 EXACT 对设置敏感。SET EXACT ON 意味着值将被一个字节一个字节的进行比较,两个表达式中较短的那个被填补上零以达到较长的那个的长度,同时尾随的零将被忽略。SET EXACT OFF 将在右边的表达式的末尾停止。精确比较请使用 ==,包括二进制的零。
在 Varbinary 和 Character 或者 Varchar 值之间进行比较的结果取决于这些值的顺序。如果 Varbinary 值在比较操作符的左边,在 Varbinary 值中尾随的二进制零将被忽略,但在 Character 值中的尾随空格是有效的。如果 Varbinary 值在右边,那么在 Character 值中的尾随空格将被忽略,但在 Varbinary 值中的尾随二进制零将是有效的。例如,继续前面的示例代码:
? Field1 = ‘Fox Rocks’ && 显示 .T.
? Field1 + 0h00 = ‘Fox Rocks’ && 显示 .T.
? Field1 = 'Fox Rocks ’ && 显示 .F.
? ‘Fox Rocks’ = Field1 && 显示 .T.
? 'Fox Rocks ’ = Field1 && 显示 .T.
? ‘Fox Rocks’ = Field1 + 0h00 && 显示 .F.
给一个绑定到 Varbinary 字段的文本框的 Format 属性添加“F”将防止用户输入的值被填补上二进制的零。你还可以在 InputMask 中使用“H”来防止非十六进制字符被输入到指定的位置。
ALINES() 在它接收到的第三个参数是 .T. 或者 1 的时候会删除尾随的二进制零。此外,如果分析字符没有被指定,ALINES() 会在出现 ohoA (十六进制的行齐满)值的地方分行。
TRANSFORM() 返回不带 0h 的二进制值的字符表示。例如,TRANSFORM(0hA0A1A2) 返回“A0A1A2.”
当字段是空的、或者仅包含二进制零的时候,ISBLANK() 和 EMPTY() 返回 .T.。
BITSHIFT() 和 BITRSHIFT() 例外,这些位函数支持 Varbinary 值。所有被传递给 BITAND()、BITOR()、和 BITXOR() 的参数,如果其中一个是Varbinary值,则全部都必须是 Varbinary 值。BITCLEAR()、BITNOT()、和 BITSET() 有着新的 nStartBit 和 nBitCount 参数,用来指出位操作所应用的范围。忽略这些参数意味着操作应用于所有的位,而只指定 nStartBit 则表示操作只应用于指定的位上。
更多www.sn58.cn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加菲猫的VFP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值