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


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

  1. --聲明標量變量  
  2. declare @a varchar(max)  
--聲明標量變量
declare @a varchar(max)
  1. --給變量賦值'AAA'  
  2. set @a = 'AAA'  
--給變量賦值'AAA'
set @a = 'AAA'
  1. --分別查詢長度  
  2. select LEN(@a) AS a_len,DATALENGTH (@a) AS a_datalength  
--分別查詢長度
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() 任何表達式的字節數,包括空格。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM