首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >VFP字段Varbinary 的特性,不进行代码页转换意味着什么?

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

作者头像
加菲猫的VFP
发布2022-04-07 19:33:06
发布2022-04-07 19:33:06
7200
举报
文章被收录于专栏:加菲猫的VFP加菲猫的VFP

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

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

代码语言:javascript
复制
create cursor Test (Field1 Q(20))
insert into Test values (0h466F7820526F636B73)
  && 字符串 "Fox Rocks" 的二进制表示
? vartype(Field1)  && 显示 "Q"
? len(Field1)      && 显示 9
? Field1           && 显示 0h466F7820526F636B73
这里是关于 Varbinary 的一些细节:
  1. Varbinary 有着跟 Varchar 类似的功能:你可以建立基于它的索引(由于索引的键必须是固定长度的,所以将被填补空格到字段的长度),它接受 null 值,而且在一个表或者游标中的 Varbinary 字段有着 254 个字符的长度限制。 2.3 Varbinary 跟 Varchar 的区别是:MACHINE 是在 Varbinary 字段上建立索引时唯一允许的排序顺序;使用别的顺序会导致一个“invalid collation sequence”(无效的排序顺序)错误。
  2. 另一个区别是 SQL LIKE 操作符以及 LIKE()、LIKEC()、BINTOC()、CTOBIN() 函数是不允许使用在 Varbinary 值上的。
  3. 你可以根据一个 Varbinary 字段的二进制或者字符表达式进行 SEEK()。例如,SEEK 0h466F7820526F636B73 跟 SEEK 'Fox Rocks' 将找到同一条记录。
  4. 在 Varbinary 字段上不会执行代码页转换,因此表设计器中没有 Varbinary(Binary)的选择,在 CREATE TABLE/CURSOR 命令中也不需要 NOCPTRANS。
  5. TYPE() 和 VARTYPE() 会为 Varbinary 字段和存储在内存变量中的 Varbinary 值返回“Q”。
  6. 串联 Varbinary 和 Character(或者 Varchar)值产生的结果,其数据类型是第一个值的数据类型。例如,继续前面示例中的代码:
代码语言:javascript
复制
? "It's true that " + Field1  && 显示 "It's true that Fox Rocks"
? Field1 + " tonight"         && 显示 0h466F7820526F636B7320746F6E69676874

你可以使用这个行为特性来在字符和Varbinary之间进行转换。下面代码中的第一行将Varbinary转换成字符,而第二行则将字符转换成Varbinary:

代码语言:javascript
复制
? '' + 0h466F7820526F636B73      && 显示 "Fox Rocks"
? substr(0h00 + "Fox Rocks", 2)  && 显示 0h466F7820526F636B73

当然,你也可以使用在本书第14章“语言的增强”中讨论的新 CAST() 函数来在 Character 和 Varbinary 之间进行转换。

  1. 字符型一样,Varbinary 值们之间的比较对 EXACT 对设置敏感。SET EXACT ON 意味着值将被一个字节一个字节的进行比较,两个表达式中较短的那个被填补上零以达到较长的那个的长度,同时尾随的零将被忽略。SET EXACT OFF 将在右边的表达式的末尾停止。精确比较请使用 ==,包括二进制的零。
  2. 在 Varbinary 和 Character 或者 Varchar 值之间进行比较的结果取决于这些值的顺序。如果 Varbinary 值在比较操作符的左边,在 Varbinary 值中尾随的二进制零将被忽略,但在 Character 值中的尾随空格是有效的。如果 Varbinary 值在右边,那么在 Character 值中的尾随空格将被忽略,但在 Varbinary 值中的尾随二进制零将是有效的。例如,继续前面的示例代码:
代码语言:javascript
复制
? 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.
  1. 给一个绑定到 Varbinary 字段的文本框的 Format 属性添加“F”将防止用户输入的值被填补上二进制的零。你还可以在 InputMask 中使用“H”来防止非十六进制字符被输入到指定的位置。
  2. ALINES() 在它接收到的第三个参数是 .T. 或者 1 的时候会删除尾随的二进制零。此外,如果分析字符没有被指定,ALINES() 会在出现 ohoA (十六进制的行齐满)值的地方分行。
  3. TRANSFORM() 返回不带 0h 的二进制值的字符表示。例如,TRANSFORM(0hA0A1A2) 返回“A0A1A2.”
  4. 当字段是空的、或者仅包含二进制零的时候,ISBLANK() 和 EMPTY() 返回 .T.。
  5. BITSHIFT() 和 BITRSHIFT() 例外,这些位函数支持 Varbinary 值。所有被传递给 BITAND()、BITOR()、和 BITXOR() 的参数,如果其中一个是Varbinary值,则全部都必须是 Varbinary 值。BITCLEAR()、BITNOT()、和 BITSET() 有着新的 nStartBit 和 nBitCount 参数,用来指出位操作所应用的范围。忽略这些参数意味着操作应用于所有的位,而只指定 nStartBit 则表示操作只应用于指定的位上。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 加菲猫的VFP 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档