具有尾随空格的CHAR行为

时间:2009-11-18 14:28:29

标签: sql sql-server sql-server-2005 types

鉴于下面的SQL语句,我希望查询的结果是:

|testX|5|
|XXXXX|5|

这是因为列是一个char(5),我希望它插入空白尾随空格来填充列中的剩余空格,因为插入的值少于五个字符。但是,查询实际上会产生以下结果:

|test|4|
|X|0|

有人可以解释一下。为什么没有用尾随空白填充的值使它们填满长度为5的列?为什么REPLACE函数在完全为空的字符串时为第二个值插入一个X?

USE Test;
GO

SET ANSI_PADDING ON;
GO

CREATE TABLE BlankTest
(
    Value char(5) NOT NULL
);
GO

INSERT INTO BlankTest (
    Value
) VALUES (
    'test'
);
GO

INSERT INTO BlankTest (
    Value
) VALUES (
    ''
);
GO

SELECT REPLACE(Value, ' ', 'X'), LEN(Value)
FROM BlankTest;
GO

DROP TABLE BlankTest;

1 个答案:

答案 0 :(得分:2)

REPLACE返回varchar

尝试使用SELECT

...REPLACE(Value, ' ', 'ZZZZZZZZZ')

当然,这不是char(5),所以它是什么

...SQL_VARIANT_PROPERTY (REPLACE(Value, ' ', 'ZZZZZZZZZ'), 'MaxLength')...

8000,最大varchar ...

编辑:

  1. 我聪明的alec同事提醒我,你需要使用DATALENGTH来包含尾随空格,而不是LEN。 Asked often here

  2. WHERE value = 'test'。这里的'test'是varchar,它的字符比higher precedence (fixed)多,所以该列被转换为varchar,从而有效地截断