首页 新闻 会员 周边 捐助

一个简单的sql查出的怪物,请高人验其真身

0
悬赏园豆:50 [待解决问题]
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=''条件查询出来。

cjcq的主页 cjcq | 初学一级 | 园豆:152
提问于:2012-06-11 15:41
< >
分享
所有回答(3)
0

where name=''

怎么会查询出name有内容的记录?

无之无 | 园豆:5095 (大侠五级) | 2012-06-11 15:43

我也奇怪呢,你可以建一张表,然后设一个navarchar(50)的字段,然后把这个字符串添加进去查询一下,我这里可以重现

支持(0) 反对(0) cjcq | 园豆:152 (初学一级) | 2012-06-11 15:57

@cjcq: 呵呵,可能没办法,我这里没有英文的SQL。你这个情况也不应该可以重现。如果可以,那就是SQL的BUG了。

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-06-11 15:59

@笨笨蜗牛: 感谢你的回答,我在中文版的mssqlserver里面也重现这个问题了

支持(0) 反对(0) cjcq | 园豆:152 (初学一级) | 2012-06-11 16:06

@cjcq: 

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-06-11 16:11

@笨笨蜗牛: 

使用下面的插入语句

  insert into name(name) 
  select N'������������'
  
  SELECT *
  FROM [dbo].[name]
  where name=''

结果重现:

name
������������
������������
������������
������������
支持(0) 反对(0) cjcq | 园豆:152 (初学一级) | 2012-06-11 16:23

@cjcq: 那就搞不定了。

你的意思是:”“插入后,可以在name=''查询到吧?偶木有办法了。应该是编码问题。要看下字符“”的ASC码了,或者SQL的特殊内容。

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-06-11 16:33

@笨笨蜗牛: 还是非常感谢你!

支持(0) 反对(0) cjcq | 园豆:152 (初学一级) | 2012-06-11 16:39
0

你存进去的字符SQL不认识就这样了 以前遇到过要存这两个Φφ 结果变成?的  试试改下数据库的这个设置 这个就是字符集 我截图的这个设置应该是认识的 但是更改这个设置影响很大 比如区分大小写等等....

Xheart | 园豆:178 (初学一级) | 2012-06-11 20:13

现在就是不清楚这个字符是哪国的字符,我就是纳闷即使在当前排序规则下不识别的字符,也不应该把这个字符判定为空呀

支持(0) 反对(0) cjcq | 园豆:152 (初学一级) | 2012-06-12 09:11

@cjcq: 我遇过会变成?的 嘻嘻 

支持(0) 反对(0) Xheart | 园豆:178 (初学一级) | 2012-06-12 09:15
0

亲,你插入的名字是中文的  把如果是 你把插入的名字换成英文的看能否查出来,如果能的话就是你用的SQLServer有问题了。把设置更改更改,或者换个中文的般的用

jory | 园豆:324 (菜鸟二级) | 2012-06-11 21:48

感谢回复,sqlserver应该没有问题,中文版的也试过。

支持(0) 反对(0) cjcq | 园豆:152 (初学一级) | 2012-06-12 09:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册