?"ABC">"A"
返回.F.
?"ABC">"B"
返回.F.
?"ABC">"a"
返回.T.
这似乎不是ASCII比较(与其他常见的编程语言一样)。
我搜索了MSDN,但是Relational Operators只解释了数字类型或布尔值的比较。 String and Value Comparison未提及lt / gt / lte / gte运算符。
为什么字符串比较会像这样工作?什么是VFP的字符串lt / gt比较的内部规则?
答案 0 :(得分:4)
实际上VFP的字符串比较与其他语言没什么不同(某些语言-ie:C# - 甚至不允许你使用> =,>,< =和< with字符串)。但是,在VFP中有一个设置会影响字符串比较,它是“设置正确”。除此之外,VFP字符串区分大小写,因此" ABC" > ""为false(alpha排序基于其ASCII字符代码)。
使用默认的SET EXACT OFF,将字符串与右操作数的长度进行比较。即: " ABC" =" A"
比较如下: " A" =" A"
因此它们是平等的,所以" ABC" > " A"是假的(还有#34; 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,&#34; ABC&#34; =&#34; A&#34; (并且由于SQL规则,更改操作数&#39;左侧和右侧不重要,因此&#34; A&#34; =&#34; ABC&#34;也是如此)。即:
Select * from myTable where firstName = "A"
将返回具有firstName&#34; Anthony&#34;,&#34; Alice&#34; ... 等等。
VFP中有一个特殊的==(完全相等)运算符,它与SET EXACT或SET ANSI设置无关。请注意它的行为与常规命令和SQL命令不同。通过常规命令,它实际上意味着完全相同的&#39;包括两个比较字符串中的尾随空格。即:
? '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。