SQL – Character data (varchar)

來源:互聯網
上載者:User

剛剛才考慮是否天天寫!不過,是該繼續努力做下去了。不然,渾渾噩噩過日子不好了,上有老下有小的。再說,寫寫文章長長記性!提高提高自己!:)

好了,不廢話了!剛才查查郵件,收到了sqlservercentral.com的Newsletter。這期裡面有個問題:

declare @str varchar(max) select @str = replicate('#',10000) + replicate(cast('#' as varchar(max)),8000)+ '#' + '#' + '#' select len(@str)The output of the above code in SQL Server 2005 is:A. 16003B. 18005C. 8000D. Error: Incorrect syntax near '.

可能不怎麼用過varchar這個資料類型,更加是不清楚varchar(max)的情況。結果,我選的答案是C,不過 Sorry - you were wrong

我的理解是varchar在SQL Server 2005中的長度只有8000 bytes,最多也就8000 bytes了。所以就選了C,一個錯誤的答案。

原來,varchar在varchar(max)的時候,最大能容下2,147,483,648 bytes,這是在SQL Server 2005中的情況。而在Oracle 9i,varchar只有 4000 bytes。在MySql,有65,535 bytes。

因此,那答案會不會是B呢?不,B也是錯誤的。也不會是D,至少那些SQL Statement不會出錯。

正確答案是A。

原因是:replicate這個函數雖然可以按照你的想法把指定的字元(串)複製一定的次數,但不是無限的,在沒有指定字元(串)的資料類型為varchar(max)或nvarchar(max)的情況下,replicate只會得到一個8000 bytes的值,多出都會自動截斷。

這樣,第一個replicate('#',10000) 只能得到 8000 個 '#' ;而第二個有把 '#' 顯式轉換為varchar(max),但由於指定了 8000 ,因此也只有 8000 個 '#' 。

再加上後面 3 個 '#' ,最後的 len 函數的結果也就是 16003 了。

 

雖然這個問題的目的是replicate函數,但同時varchar也在裡面,也有varchar(max)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.