標籤: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()兩內建函數的區別(轉載)