Visual FoxPro 的字符串 lt(<)/gt(>)/lte(<=)/gte(>=) 比较规则是什么?
What's Visual FoxPro's string lt(<)/gt(>)/lte(<=)/gte(>=) comparison rule?
?"ABC">"A"
returns .F.
?"ABC">"B"
returns .F.
?"ABC">"a"
returns .T.
这似乎不是 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。
?"ABC">"A"
returns.F.
?"ABC">"B"
returns.F.
?"ABC">"a"
returns.T.
这似乎不是 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。