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)
所以你那几个语句成立的原因就在这儿。