今天写一个项目的用户登录部分 刚开始做,所以是数据库和程序一起写
一开始没注意 在定义表T_Person时吧PerID和PerPwd的类型设定都是char(20)
并且写入了几个数据,诸如 id:01,pwd:01 等等这样的。
后来突然想起来这中间大有区别。赶紧分别改成nvarchar(50)和varchar(20)
但是在后来程序调试的时候 发现输入密码‘01’跟数据库读出的密码匹配不上
加断点看到数据库读出的是‘01 ’ 这样后面带空白的。
大吃一惊, 然后百度确认了好几遍,带var的会自动清后面的空白,不带的保留;带n的是unicode格式
以为.net这边的问题,查了几遍也没什么头绪。 在SQLServerManagement里面做查询,发现在这边返回的也是带空白的
瞬间感觉不会在爱了。。
于是又疯狂百度。 终于在一个比较隐蔽的帖子里看到一句 “char()改为varchar()时 空白不会自动删除” 才意识到自己错在哪了
我的把id和pwd的属性改了之后并没有意识到数据这个是时候是不会改变的。
因为对char(x)型数据来说,长度一定是x,用户没有空下的地方会被当做数据的一部分。
这个时候改变为varchar(x)类型,原数据会原封不动的保留下来。
nchar(x)和nvarchar(x)的情况类似。
值得注意的是,在改过之后 形如“select PerID from T_Person where PerID='01'”的语句是能匹配的
但返回的PerID依然是带空白的‘01 ’
这应该是sqlserver内部的某种机制。 具有一定的迷惑性。
---------------------------------------------------------------------------------------------------------------
我想这次的错误 说明一定要培养一种程序员的意识,就是让自己的思维能尽量的贴近计算机的思维。
在自然逻辑和程序逻辑间随意跳转全无漏洞就是程序员的一种境界吧。