SQLServer中DataLength()和Len()兩內建函數的區別(轉載)

來源:互聯網
上載者:User

標籤:div   自己   字母   nbsp   ima   strong   map   arc   alt   

最近工作中遇到了個問題:在資料庫中聲明欄位類型時char(4),但實際只儲存了‘DCE’三個字母,程式中拼裝以該欄位作為key的Map中,會把‘DCE’+空格作為其Key,這樣造成用沒加空格的‘DCE’為key去取Value的值是取不出來的,結果是空。後來查看資料庫欄位類型才發現了問題所在。大家都知道,char和varchar的區別就在於一個是固定長度,一個是可變長度。在尋找問題的過程中,用到了我們今天要說的這兩個內建函數,DataLength()和Len()。
在解釋DataLength()和Len()的區別之前,我們先來瞭解一下varchar(n)和nvarchar(n)的區別。

  • varchar(n):長度為n個位元組的可邊長度且非Unicode編碼的字元資料,n必須是介於1和8000之間的數值。儲存大小為輸入資料的位元組的實際長度,而不是n個位元組。
  • nvarchar(n):包含n個字元的可變長度Unicode字元資料,n必須是介於1和4000之間,位元組的儲存大小是所輸入的字元個數的兩倍。

也就是說,varchar(2)最多可以儲存2個字母,或者是1個漢字;而nvarchar(2)最多可以儲存2個字母,或者兩個漢字,就是說nvarchar(2)包含兩個字元=4個位元組。
瞭解了以上內容,我們來通過例子看下DataLength()和Len()的區別:

--聲明標量變數  declare @a varchar(max)  
--給變數賦值‘AAA‘set @a = ‘AAA‘
--分別查詢長度select LEN(@a) AS a_len,DATALENGTH (@a) AS a_datalength

1、@a=‘AAA‘,結果如下: 

2、@a=‘AAA ‘,這裡尾部加了兩個空格,結果如下:

3、@a=‘ AAA‘,這裡前面加了兩個空格,結果如下:

4、@a=‘A A A‘,這裡A之間各加一個空格,結果如下:

得出以下結論:

當採用非Unicode編碼時,即varchar類型的字串時,DataLength()和Len()的區別:

  • Len() 字串運算式的字元數,不計尾部空格,但計頭部空格和中間的空格;
  • DataLength() 任何錶達式的位元組數,包括空格,所以當資料類型是nvarchar時,其實DataLength() 除以2就相當於Len()計算字串末尾空格後的字元數,所以計算sql server中nvarchar字串長度的最佳方式就是DataLength() /2

當採用UniCode編碼時,感興趣同學的可以自己試一下什麼結果。

 

原文連結

 

SQLServer中DataLength()和Len()兩內建函數的區別(轉載)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.