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