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

Jam*_*its 3 foxpro visual-foxpro

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

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

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

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

Cet*_*soz 6

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

使用默认 SET EXACT OFF 时,字符串将与右操作数的长度进行比较。即:“ABC”=“A”

比较如下:“A”=“A”

因此它们是相等的,因此“ABC”>“A”为假(“ABC”<“A”为假,“ABC”=“A”为真)。

回顾一下,默认 SET EXACT 设置为 OFF:“ABC”=“A”(但“A”=“ABC”为 false - 与右操作数的长度进行比较)。

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.
Run Code Online (Sandbox Code Playgroud)

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

Select * from myTable where firstName = "A"
Run Code Online (Sandbox Code Playgroud)

将返回名字为“Anthony”、“Alice”...等的记录。

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

? 'ABC' == 'ABC ' && false, regardless of SET EXACT
Run Code Online (Sandbox Code Playgroud)

然而,对于 SQL(无论 SET ANSI 设置如何):

select * from myTable where myField == 'A'
select * from myTable where myField == 'A '
select * from myTable where myField == 'A  '
Run Code Online (Sandbox Code Playgroud)

全部含义相同,并搜索 myField 内容为 A 的记录(无论字段大小如何 - 比较两侧的尾随空格都将被忽略)。

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