高手解释下为什么。sql问题。

来源:百度知道 编辑:UC知道 时间:2024/07/02 12:35:15
create table table1
(sno char(10),
sname char(20),
ssex char (2)
)
insert table1 values
('101','张一','男')
insert table1 values
('102','张一二','男')
insert table1 values
('103','张一二三','男')
insert table1 values
('104','张一二三四','男')
insert table1 values
('105','张一二三四五','男')

select * from table1
where sname like('张_____')

结果:
101 张一 男
102 张一二 男
103 张一二三 男
104 张一二三四 男
105 张一二三四五 男
照原理上来分析应该只有张一二三四五。但为什么会出现其他的,请解释下。我试过。如果下划线在中间,比如张__强,下面有几个下划线查询结果就一定是中间有几个汉字的。
请问,到底是怎么回事?答得好的有加分。谢谢。
我用的是sql2000开发版,查出来结果就是这样的。你们用的是什么版呀?
三楼你好。我如果输入张一二三。到这儿其实就结束了,后面根本就没有空字符。所以我想根本不存在空字符的问题吧。

问题出在你的sname字段的类型上,你肯定用的是char类型,如果改成varchar就可以按照你的预期得到结果了.
在char下,存储的效率比较高,因为字符串长度定长,比如你是char(50)的,那么如果字符串本身只用了前8位的话,那么后面的位置都用空格填充.
所以对like的通配符处理时是要经过特殊处理的.
另外,汉字对应char的两个存储单元,所以你存'a'和存'啊'占的位置是不一样的,而数据库根本不管你是不是存的中文,xxxx这样的占位可以表示4个英文字母abcd,也可以表示2个中文 啊啊 也可混合 a啊a
所以会对单字匹配符_造成影响.

人家LIKE like('张_____') 有5个通配符
通配符可以把空字符也算进了
所以你查到的是全部。

你那样还不如这样
select * from table1
where sname like('张%') and len(sname)=6

这应该算个模糊查询了,即是5或5个字符以下的第一位为张的字段都能被查询出来,如果你想只要“张一二三四五”的数据可以用like('张?????'),这样好像能查出你所要的结果,没有验证,你自己试试吧。

郁闷。。为什么我 查出来就一个。。就是张一二三四五啊。。

我也是OK啊