标题:left()函数在VFP FOR与VFP+SQL查询中使用结果为何不同?
只看楼主
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
结帖率:79.3%
已结贴  问题点数:20 回复次数:34 
left()函数在VFP FOR与VFP+SQL查询中使用结果为何不同?
left()在下列查询语句中截取不同的位数
select xm,xh from bmk0651 where left(xm,1)='周'
select xm,xh from bmk0651 where left(xm,2)='周'
select xm,xh from bmk0651 where left(xm,3)='周'
查询结果一样


但在
brow fiel xm for left(xm,2)='周'  &&才能产生正确的结果
搜索更多相关主题的帖子: where 
2013-08-21 15:25
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
得分:4 
注意
一个汉字占两个字符长度
SET EXACT 是否设置为 ON
vfp字符串是汉字或中英混合时,使用leftc替代left函数

个性太多,无法显示
2013-08-21 16:40
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
一般情况下,姓名是中文,截取2位
为什么VFP+SQL中left(xm,1)='周'或left(xm,3)='周'也能得出正确的结果?
而VFP+SQL中subs(xm,1,2)='周'结果是正确,但改为SUBS(xm,1,3) =‘周'错了!



[ 本帖最后由 sylknb 于 2013-8-22 10:11 编辑 ]
2013-08-22 10:07
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
得分:0 
设置set exact on

个性太多,无法显示
2013-08-22 10:24
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
设置set exact on ,还是老样。
2013-08-22 16:26
dhy793202
Rank: 1
等 级:新手上路
帖 子:29
专家分:4
注 册:2013-3-17
得分:4 
=和==
用LEFT()=='周',用=不是完全等于关系,是从第一位开始包含的都算
2013-08-22 17:39
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
得分:4 
left(xm,1)中的1 是指字节

1 一个字节 2 两个字节 3 三个字节

一个汉字是几个字节?
2013-08-22 20:55
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
当然知道一个汉字是2个字节,用LEFT()=='周',用=不是完全等于关系,是从第一位开始包含的都算 。
我说的是为什么?
select xm,xh from bmk0651 where left(xm,1)='周'
select xm,xh from bmk0651 where left(xm,2)='周'
select xm,xh from bmk0651 where left(xm,3)='周'
查询结果一样

而用 brow for left(xm,1)='周'  是错误的
2013-08-23 08:22
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
得分:4 
我来跟你说一下:
“周”的内码是多少?55004,将你的表中加入这向个名字,保证你的哪三条语句都不成立。
加入几个下面姓氏的名字就能回答你了。
"州","粥","帚"

"周"的两字节表达是:内存表示:低八位chr(220)+高八位chr(214),实际操作表达:chr(214)+chr(220)
select xm,xh from bmk0651 where left(xm,1)='周',只对比了chr(214),而你的记录中没有高八位是chr(214)的记录,所以,与select xm,xh from bmk0651 where left(xm,2)='周'的结果是一样的。而"州","粥"的高八位也是chr(214),加几个姓这个的,结果就不一样了。
至于select xm,xh from bmk0651 where left(xm,3)='周',不知道你的XM字段有几个字,“周”后面的是什么字,这个我想不会成立的。
2013-08-23 09:22
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
得分:0 
select xm,xh from bmk0651 where left(xm,3)='周',等效于select xm,xh from bmk0651 where left(xm,2)='周'
sele * from alias() where left(xm,1)="周" 等效于sele * from alias() where left(xm,1)=chr(0)
为什么呢?
全部因为代码页的问题。
left("周",1)=substr("周迅",1,1)=substr("周迅",3,1)=chr(0)

left("周",1)<>substr("周",2,1)<>substr("周迅",4,1)<>chr(0)
ASCII字符,一字节,内码区间0-255
因为汉字为两字节,基本内码区间33088-65100的样子(理论上是0x0000-0xffff,0-65535)
如果只取汉字的高字节(第一字节),基本在0x81-0xFF(十进制:129-255),如果转换成字符ASCII字符chr(129)-chr(255)要么是真空(绝对0,chr(0))要么是拉丁或注音符,但VFP在处理时将ASCII码大于129(129-255)区间的值均认为是绝对0(chr(0))了,仅chr(255)例外。下面的程序将是有效的。
for a=129 to 255
??" ",a,chr(a)=chr(0)
endfor
除chr(255),全部返回.T.,而汉字的第一个字节也就刚好处在129-254这个区间。所以取汉字第一个字节没有意义,它表示出来的就是一个空。
以"周汉"为例
substr("周",1,1)=substr("汉",1,1)=left("周",1)=left("汉",1)=chr(0)
所以你那几个语句成立的原因就在这儿。
2013-08-23 11:18



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




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

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