Visual FoxPro 的字符串 lt(<)/gt(>)/lte(<=)/gte(>=) 比较规则是什么?


  • ?"ABC">"A"返回.F.
  • ?"ABC">"B"返回.F.
  • ?"ABC">"a"返回.T.

这似乎不是ASCII比较(就像在其他常见的编程语言中一样(。

我搜索过MSDN,但是Relational Operators只解释了数字类型或布尔类型之间的比较。字符串和值比较没有提到lt/gt/lte/gte运算符。

为什么字符串比较是这样工作的?VFP对字符串lt/gt比较的内部规则是什么?

实际上,VFP的字符串比较与其他语言没有太大区别(有些语言,例如C#,甚至不允许您使用>=、>、<=和<字符串(。然而,在VFP中,有一个设置会影响字符串比较,它就是"SET EXACT"。除此之外,VFP字符串区分大小写,因此"ABC">"a"为false(alpha排序基于其ASCII字符代码(。

在默认SET EXACT OFF的情况下,将字符串与右操作数的长度进行比较。即:"ABC"="A">

比较如下:"A"="A">

因此它们是相等的,所以"ABC">"A"是假的(而且"ABC"<"A"也是假的,"ABC"="A"就是真的(。

概括一下,默认SET EXACT设置为OFF:"ABC"="A"(但"A"="ABC"为假-最多可比较右侧操作数的长度(。

AND,字母顺序使用ASCII码。

SET EXACT OFF && Default if not set explicitly
? "ABC" = "A" && .T.
? "ABC" > "A" && .F.
? "ABC" < "B" && .T.
SET EXACT ON
? "ABC" = "A" && .F.
? "ABC" > "A" && .T.
? "ABC" < "B" && .T.

特别注意:如果您在SQL命令中执行此相等性检查,则会应用ANSI规则,并且SET EXACT在那里不起作用。默认情况下,SET ANSI为OFF,"ABC"="A"(由于SQL规则,更改操作数的左侧和右侧无关紧要,因此"A"="ABC"也是真的(。即:

Select * from myTable where firstName = "A"

会返回名字为"Anthony"、"Alice"的唱片。。。等等

VFP中有一个特殊的==(完全相等(运算符,它独立于SET EXACT或SET ANSI设置。注意它的行为与常规命令和SQL命令不同。对于常规命令,它实际上意味着"完全相等",包括两个比较字符串中的尾部空格。即:

? 'ABC' == 'ABC ' && false, regardless of SET EXACT

但是,使用SQL(不管SET ANSI设置如何(:

select * from myTable where myField == 'A'
select * from myTable where myField == 'A '
select * from myTable where myField == 'A  '

所有的意思都相同,并搜索myField内容为A的记录(无论字段大小如何,都会忽略比较两边的尾随空格(。

注意:我认为您可以请求在堆栈溢出中添加文档主题。VFP文档刚刚开始,还没有添加,AFAIK

最新更新