标题:left()函数在VFP FOR与VFP+SQL查询中使用结果为何不同?
只看楼主
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:0 
以下是引用sylknb在2013-8-23 14:20:19的发言:

你指的哪二条命令?

就是:“BROWSE FOR LEFT(姓名,1)=LEFT([州],1)”或“BROWSE FOR LEFT(姓名,1)=[]”这两条命令。
2013-08-23 14:48
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:0 
以下是引用sylknb在2013-8-23 14:47:44的发言:

taifu945:
你说的哪二条命令?
我以下和命令是不是你说的?实验如下:

brow for left(xm,1)=left('州',1),=左,右长度相等,全部记录出来

brow for left(xm,1)=left('州',2)=右长度>左长度

BROWSE FOR LEFT(xm,1)=[],=左长度>右长度 全部记录出来了

第一条命令可能我没测试周全,全部记录都出来的原因就是16楼所述,单字节的时候,FoxPro中,CHR(129)-CHR(254)的值是相同的。所以,任何汉字的一半都相同,就造成了你第一种情况。第二种情况和第三种情况与我13楼所述的是一样的。
2013-08-23 14:56
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:0 
其实第三条命令,和空串比较有点特殊,不能单看右边长度<左边长度,就得到输出全部记录的结论。主要是因为空串相当于没有条件,也就是相当于没有“FOR”子句,无条件输出全部记录。所以才会输出全部记录。你写条命令:BROWSE FOR LEFT(姓名,3)=[周],就只会出来姓“周”的名单。这条命令也是右边长度<左边长度的例子。
2013-08-23 15:07
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
1。brow for left(xm,1)=left('周',1)  &&左=右
结果:全部记录
2。brow for left(xm,1)=left('周',2) &&左<右
结果:空记录
3。brow for left(xm,3)=left('周',1)&& 左>右
结果:11条,含有与周的第一字节的记录。
2013-08-23 15:29
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:0 
以下是引用sylknb在2013-8-23 15:29:15的发言:

1。brow for left(xm,1)=left('周',1)  &&左=右
结果:全部记录
2。brow for left(xm,1)=left('周',2) &&左<右
结果:空记录
3。brow for left(xm,3)=left('周',1)&& 左>右
结果:11条,含有与周的第一字节的记录。
在左长>=右长的情况下,就会进行机内码比较。第一条命令因为两边等长,机内码的值又是“相等”,所以输出全部记录;第三条命令,由于左右不等长,所以,CHR(129)=CHR(130)=...=CHR(254)的法则也不管用了,真正以第一字节的内码完全相等来衡量了。
2013-08-23 15:40
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:0 
教你一个方法:如何在左右等长的情况下,也达到第三条命令的效果。可以用命令:BROWSE FOR LEFT('周',1)$LEFT(姓名,1)。
2013-08-23 15:52
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
得分:0 
回复 17楼 taifu945
pagecode相关,你的PCode是437吧,我的是936中文.在,config.fpw里,加一条,pagecode=nnnn,这个也影响串的比较和表内客的格式,我这儿129-25全是chr(0)
2013-08-23 16:01
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
得分:0 
纠结这么多有啥用
用leftc就好了
帮助文件中都已经明确了

说明
LEFTC( ) 是为包含双字节字符的表达式设计的。如果表达式只包含单字节, LEFTC( ) 等同于 LEFT( )。

LEFTC( ) 从包含单字节和双字节的任意组合的字符表达式中返回指定数目的字符。

LEFTC( ) 与起始位置为 1 的 SUBSTRC( ) 等价。

该函数在操作象“平假名”和“片假名”这样的双字节字符集语言时是有用的。

个性太多,无法显示
2013-08-23 16:04
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
得分:0 
leftc这样的函数就是为了双字节设计的
说明left这样的函数处理双字节的时候可能是有误差的
要不还要设计两个同样功能的函数干嘛?

个性太多,无法显示
2013-08-23 16:06
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
第一条命令因为两边等长,机内码的值又是“相等”,所以输出全部记录

brow for left(xm,1)=left('周',1)  &&左=右
我所说的全部记录是表中所有记录什么姓名都有,不光与了‘周’内码214相等的的姓名也有同码不是214的如‘陆’(49853),王(52725)
1。你说的机内码的值又是“相等”是指什么?是不是214,等等
2。知‘周’55004,用什么方法知道: 低八位chr(220)+高八位chr(214)?
2013-08-23 16:08



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-419474-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.951827 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved