不变字符,填充和LEN()混淆

时间:2011-10-09 18:16:14

标签: sql-server tsql

如果存储的字符串小于列可以存储的最大字符数,则不变字符列C1会用空格填充字符串。因此,当以下语句插入一行时,其C1字符串包含80个字符,其中74个是空格字符。

CREATE TABLE MyTable
(
    C1 char(80)
);

INSERT INTO MyTable (C1)
VALUES ('   ABC');

a)

  

LEN()返回指定字符串的字符数   表达式,不包括尾随空白。

我意识到这74个额外的空间是由数据库系统而不是用户添加的,但事实仍然是字符串确实包含那些空格,因此LEN()包含额外空格也不会更有意义在结果?

b)看来MS Sql server在查询结果窗口中没有显示这74个额外的空格。那是为什么?

c)无论如何,我假设当我们从数据库中检索这一行时,C1字符串将包含所有这些额外空格?

谢谢

1 个答案:

答案 0 :(得分:4)

a)这就是LEN被定义为工作的方式,使用DATALENGTH来获取包括尾随空格的长度(但除以2以得到unicode数据类型的字符长度)。

SQL Server中也会忽略尾随空格以进行相等比较。即SELECT * FROM MyTable WHERE C1 = ' ABC'将返回结果。

b)在SSMS中,事实上返回尾随空格并不是很明显,在结果到网格模式中,列宽并不表示这一点,但如果你将C1复制并粘贴到其他地方,你会看到尾随事实上,空间得以保留。

看到这种情况的一种方法是使用DBCC OUTPUTBUFFER

CREATE TABLE MyTable
(
    C1 char(80)
);

INSERT INTO MyTable (C1)
VALUES ('   ABC');

SELECT C1
FROM MyTable

DBCC OUTPUTBUFFER (@@SPID)

我的结果摘录如下

00000020   00 20 20 20 41 42 43 20 20 20 20 20 20 20 20 20   .   ABC         
00000030   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                   
00000040   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                   
00000050   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                   
00000060   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                   

ABC

后面可以看到所有空格

c)是的。见(b)