Jam*_*its 3 foxpro visual-foxpro
?"ABC">"A"回报.F.?"ABC">"B"回报.F.?"ABC">"a"回报.T.这似乎不是 ASCII 比较(与其他常见编程语言一样)。
我搜索了 MSDN,但是关系运算符仅解释了数字类型或布尔值之间的比较。字符串和值比较没有提到 lt/gt/lte/gte 运算符。
为什么字符串比较会这样工作?VFP 字符串 lt/gt 比较的内部规则是什么?
实际上,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 文档刚刚开始,尚未完成任何添加。
| 归档时间: |
|
| 查看次数: |
1022 次 |
| 最近记录: |