SELECT * FROM [dbo].[User] where name=''
就是上面一个简单的sql结果查询出来一条数据,得到结果如下:
id name 441 ������������
name字段的数据类型是nvarchar(50)
数据库是mssqlserver 2008 R2 英文版
操作系统是windows7 中文旗舰版
查出的这条数据里面的字符串到底是什么字符,我也不知道。显示在html页面上是方块字,粘贴到记事本里面会提示格式转换,转换后变成了????。问过一些人,有人说可能是编码问题,自己也怀疑过编码问题,但是我想就算是编码问题也不应该通过name=''这样的条件查询出来。
请高人指点迷津!!
还有一点,我定义了一个nvarchar(50)的变量并将这个特殊字符赋值上去,然后用if语句判断是否等于'' 得到的结果是false
windows server 2008 中文版
mssqlserver R2 中文版环境下 也能重现这个问题
最新补充:感谢Xheart的提示,现在将问题锁定在排序规则上,到网上查了一下,������������这种字符应该属于拉丁文里面的,于是用命令select * from ::fn_helpcollations() 查找了所有的排序规则,在里面挑选了下面几个排序规则:
Latin1_General_BIN
Latin1_General_BIN2
Latin1_General_100_BIN
在where语句上加上排序规则查询
SELECT * FROM [dbo].[User] where name collate Latin1_General_100_BIN=''
这样就查不到结果。
由此得出结论:mssql server 在有当前排序规则不识别的字符情况下会强行的对字符进行转换,由于不识别转换后就变成空字符串,因此name=''这样的条件就能查询出这条记录了。
此结论有待考证,问题先不关闭,等待高人证实。如果真是这个原因,觉得也太不合理了,即使在当前排序规则下不识别的字符,也绝对不应该用name=''条件查询出来。
where name=''
怎么会查询出name有内容的记录?
我也奇怪呢,你可以建一张表,然后设一个navarchar(50)的字段,然后把这个字符串添加进去查询一下,我这里可以重现
@cjcq: 呵呵,可能没办法,我这里没有英文的SQL。你这个情况也不应该可以重现。如果可以,那就是SQL的BUG了。
@笨笨蜗牛: 感谢你的回答,我在中文版的mssqlserver里面也重现这个问题了
@cjcq:
@笨笨蜗牛:
使用下面的插入语句
insert into name(name) select N'������������' SELECT * FROM [dbo].[name] where name=''
结果重现:
name
������������
������������
������������
������������
@cjcq: 那就搞不定了。
你的意思是:”�“插入后,可以在name=''查询到吧?偶木有办法了。应该是编码问题。要看下字符“�”的ASC码了,或者SQL的特殊内容。
@笨笨蜗牛: 还是非常感谢你!
你存进去的字符SQL不认识就这样了 以前遇到过要存这两个Φφ 结果变成?的 试试改下数据库的这个设置 这个就是字符集 我截图的这个设置应该是认识的 但是更改这个设置影响很大 比如区分大小写等等....
现在就是不清楚这个字符是哪国的字符,我就是纳闷即使在当前排序规则下不识别的字符,也不应该把这个字符判定为空呀
@cjcq: 我遇过会变成?的 嘻嘻
亲,你插入的名字是中文的 把如果是 你把插入的名字换成英文的看能否查出来,如果能的话就是你用的SQLServer有问题了。把设置更改更改,或者换个中文的般的用
感谢回复,sqlserver应该没有问题,中文版的也试过。