2015-11-04 32 views
0

我正在观察一个非常奇怪的行为。请考虑以下几点:在SQL Server中将CHAR转换为VARCHAR的问题

declare @a char(15) 
set @a = 'ABC' 
select len(@a), len(convert(varchar, @a)), convert(varchar, @a) + 'D', len(convert(varchar, @a) + 'D') 

在生产出的结果中设置的值3和4是意外:

3 3 ABC   D  16 

难道是在SQL Server中的错误?任何其他解释?

+1

在使用SQL Server的二十年中,平均而言,我已经看到了一个实际的微软错误,它导致大约每十年一次的查询意外返回数据。如果你认为你看到了一个,那么你很可能只是不了解正确的行为。 –

+0

如果不清楚,问题的关键不在于这是否是SQL Server错误。关键是这种行为似乎有些不合逻辑,因此也是意料之外的。所以,而不是一般的文体批评,对这种行为的有意义的解释会受到欢迎。 – Ramzay

回答

3

char数据类型是固定宽度并且带有尾随空格的焊盘。

所以你char(15)值被填充以12结尾的空格ABC____________

LEN的文件(下得分清晰度代替空格)...

返回的字符数指定的字符串表达式, 不包括尾随空格

DATALENGTH确实计算了尾随空格。

+0

或者'RTRIM'列(当然是在转换成varchar之后)去掉空格。 – DavidG

+0

@DavidG - 不需要明确施放。 '声明@a char(15);设置@a ='ABC';选择DATALENGTH(rtrim(@a))'返回'3'。结果的数据类型是'varchar(15)'。但是,当然,重新分配给char(15)将会把OP放在他们开始的地方。 –

相关问题