1. 程式人生 > >SQLServer中DataLength()和Len()兩內置函數的區別(轉載)

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

-- 字節 varchar 1個漢字 value var bubuko 聲明 函數

最近工作中遇到了個問題:在數據庫中聲明字段類型時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()兩內置函數的區別(轉載)