SQL查询字段的空格问题

myzksky 2011-04-21 09:51:09
在SQL中如果数据库中有数据name='admin'并且password='123'
在查询的时候为什么这两条语句会得到不同的结果
select * from user where name = 'admin' and password = ' 123';查出来的结果是null
select * from user where name = 'admin' and password = '123 ';查出来的结果和没有空格的相同
那位高手给解释一下为什么!还有就是解决掉密码的空格问题,用户的密码有可能存在空格,我们不能无视呀!
...全文
1969 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
BigXuStyle 2011-06-13
  • 打赏
  • 举报
回复
这个问题跟3个方面有关:
1.其实 SQL Server 比较带有尾随空格的字符串是根据 ANSI/ISO sql-92 规范(部分8.2 <比较谓词>,常规规则#3),ANSI 标准要求,两个字符串比较时,如果两个字符串长度不一样,先扩展较短的字符串,以使其长度匹配再进行比较。
2.带有尾随空格的字符串存储到表中的值,其实这个跟当前数据库的属性设置 SET ANSI_PADDING { ON | OFF } 有关。
3.当前连接的查询结果,跟Query Options的设置有关。
myzksky 2011-04-21
  • 打赏
  • 举报
回复
是应用层,不是数据库!
myzksky 2011-04-21
  • 打赏
  • 举报
回复
我想问一下,密码字符串的后面空格要不要对它trim()处理一下!
myzksky 2011-04-21
  • 打赏
  • 举报
回复
做的小程序玩的!没有加密,呵呵!
dovei 2011-04-21
  • 打赏
  • 举报
回复
如果你的密码加密后确定没有空格
直接修改数据库
update user set password = ltrim(rtrim(password))

客户端
再用程序去掉二端的空格就好了.中间的空格不能去.可能是用户的密码也不一定
myzksky 2011-04-21
  • 打赏
  • 举报
回复
明白了,如果用户最输入密码的时候,最后一位是空格怎么办!此时数据库中的数据已经把它的后面空格去掉了,当他再次登陆的时候,密码后面是空格,还是能登陆进去的是不?
myzksky 2011-04-21
  • 打赏
  • 举报
回复
密码本身就是Varchar型的
myzksky 2011-04-21
  • 打赏
  • 举报
回复
密码好像不能对它去空格处理吧?(密码包括特殊字符)
dawugui 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 myzksky 的回复:]
在SQL中如果数据库中有数据name='admin'并且password='123'
在查询的时候为什么这两条语句会得到不同的结果
select * from user where name = 'admin' and password = ' 123';查出来的结果是null
select * from user where name = 'admin' and password = '123 ';查出来的结果和没有空格的相同
那位高手给解释一下为什么!还有就是解决掉密码的空格问题,用户的密码有可能存在空格,我们不能无视呀![/Quote]
建议你把字段更改为varchar型.
这样
'123 ' = '123'
即使保存时,是'123 ',系统未自动保存为'123'
但是' 123' <> '123'
也就是说varchar型字段,后面的空格会被忽略或无效,但是前面的空格有效.
SQL77 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 myzksky 的回复:]
如果用户密码的中存在空格,那就不能去空格了
[/Quote]
可以转成VARBINARY()比较,同色狼,你不加密么?
myzksky 2011-04-21
  • 打赏
  • 举报
回复
如果数据库中的密码存在空格呢
myzksky 2011-04-21
  • 打赏
  • 举报
回复
如果用户密码的中存在空格,那就不能去空格了
javatemptation 2011-04-21
  • 打赏
  • 举报
回复
因为是字符串,加了空格那也是一个字符,自然不一样。

解决的方法:
1.在获取用户输入的时候,使用trim()这样的函数取空格
2.在sql中去除空格,使用ltrim()或是rtrim()这样的内置函数

select * from user where name = 'admin' and password = ltrim(' 123');
select * from user where name = 'admin' and password = rtrim('123 ');
SQL77 2011-04-21
  • 打赏
  • 举报
回复
if N'123 '=N'123'
select 'a'
else
select 'b'

会去除尾部空格比较
快溜 2011-04-21
  • 打赏
  • 举报
回复
你的密码不用加密的吗?

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧