2015-11-04 247 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放在他們開始的地方。 –

相關問題