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

What's Visual FoxPro's string lt(<)/gt(>)/lte(<=)/gte(>=) comparison rule?

这似乎不是 ASCII 比较(与其他常见编程语言一样)。

我搜索了 MSDN,但是 Relational Operators only explained comparison across numeric type or boolean. String and Value Comparison 没有提到 lt/gt/lte/gte 运算符。

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

实际上,VFP 的字符串比较与其他语言没有太大区别(某些语言 - 即:C# - 甚至不允许您对字符串使用 >=、>、<= 和 <)。但是,在 VFP 中有一个设置会影响字符串比较,它是 'SET EXACT'。除此之外,VFP 字符串区分大小写,因此 "ABC" > "a" 是错误的(字母排序是基于它们的 ASCII 字符代码)。

在默认 SET EXACT OFF 的情况下,比较字符串 直到右操作数 的长度。 IE: "ABC" = "A"

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

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

回顾一下,使用默认的 SET EXACT 设置,即关闭: "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"

会 return 记录具有 firstName "Anthony"、"Alice" ... 等等。

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

? '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  '

all 表示相同并搜索 myField 内容为 A 的记录(无论字段大小是什么 - 比较两侧的尾随空格将被忽略)。

注意:我想你可以请求在堆栈溢出中添加文档主题。 VFP 文档刚刚开始,尚未完成任何添加,AFAIK。