SQL:使用char,nchar查询时需要注意

使用Sql Server的Northwind数据库的Customers表
1)代码一  
1 Declare @cCoustomerID CHAR(5)
2 SELECT @ncCoustomerID = NULL;
3 SELECT * 
4 FROM CUSTOMERS 
5 WHERE CUSTOMERID LIKE ISNULL(@ncCoustomerID'%')
 
2)代码二   
1 Declare @cCoustomerID NCHAR(5)
2 SELECT @ncCoustomerID = NULL;
3 SELECT * 
4 FROM CUSTOMERS 
5 WHERE CUSTOMERID LIKE ISNULL(@ncCoustomerID'%')
  
  3)代码三  
1 Declare @cCoustomerID VARCHAR(5)
2 SELECT @ncCoustomerID = NULL;
3 SELECT * 
4 FROM CUSTOMERS 
5 WHERE CUSTOMERID LIKE ISNULL(@ncCoustomerID'%')
 
4)代码四
1 Declare @cCoustomerID NVARCHAR(5)
2 SELECT @ncCoustomerID = NULL;
3 SELECT * 
4 FROM CUSTOMERS 
5 WHERE CUSTOMERID LIKE ISNULL(@ncCoustomerID'%')

四份代码放入到Sql查询器内,结果1)和 2)返回消息为:
(0 行受影响)

3)和 4)返回消息为:
(91 行受影响)

原因:
1)和 2)如果变量为NULL,则会在%后面补空格,而3)和 4)不会。
该死,为什么它要自动补个空格呢。真让人烦,火速赶往MSDN翻箱倒柜,原来:
char 数据类型是一种长度固定的数据类型。如果插入值的长度比 char NOT NULL 列的长度小,将在值的右边填补空格直到达到列的长度。(nchar也是这么干的)
varchar 数据类型是一种长度可变的数据类型。比列的长度小的值,不会在值的右边填补来达到列的长度。(nvarchar同理)
所以当声明变量为char或者nchar时,如果null了,它会自动帮你补齐空格知道满足定义的长度。
以后这个要小心了~嗯嗯

临了,不死心,又到SQL Server 联机丛书里面找,发现也有,文章名为:使用 char 和 varchar 数据,地址如下:ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/udb9/html/07cc67f6-5057-463b-8975-694a5b484926.htm
原文地址:https://www.cnblogs.com/TomToDo/p/1208534.html