對(duì)于大多數(shù)SQL Server編程開發(fā)者來說,當(dāng)計(jì)算字符串的長度時(shí),腦海中閃現(xiàn)的第一個(gè)函數(shù)是:Len(string),這個(gè)“長度”,默認(rèn)情況下,是指字符的數(shù)量,一個(gè)英語字符是一個(gè)長度,一個(gè)漢字是一個(gè)長度。大多數(shù)的字符串函數(shù),例如charindex,substring,stuff等函數(shù),其位置都是針對(duì)字符數(shù)量的,這使得Len函數(shù)深入人心,但是,一個(gè)Unicode字符,占用的字節(jié)數(shù)量是2Byte,而一個(gè)普通的ASCII字符占用的字節(jié)數(shù)量是1Byte,當(dāng)需要計(jì)算字符串占用的字節(jié)數(shù)量時(shí),要如何計(jì)算字符串的長度?對(duì)于各個(gè)類型所占用的字節(jié)數(shù)量,又該如何計(jì)算?帶著這個(gè)疑問,讓我們一睹DataLength函數(shù)的廬山真面目。
一,字符數(shù)量
Len(string) 函數(shù)返回的數(shù)值是字符的數(shù)量(number of characters),在統(tǒng)計(jì)字符數(shù)量時(shí),不包含結(jié)尾空格,但是包含前導(dǎo)空格。
示例,Len 函數(shù)返回的是字符的數(shù)量,而不是字符的字節(jié)數(shù)量。
declare @str_v varchar(10)declare @str_nv nvarchar(10)declare @str_nv_cn nvarchar(10)set @str_v=' ab 'set @str_nv=N' ab 'set @str_nv_cn=N' 悅光陰'select len(@str_v) as len_v ,len(@str_nv) as len_nv , len(@str_nv_cn) as str_nv_cn
二,字節(jié)數(shù)量
對(duì)于varchar類型,大家都知道,這是單字節(jié)字符,一個(gè)字符占用一個(gè)字節(jié),總共能夠表示的256個(gè)字符;而對(duì)于nvarchar類型,一個(gè)字符占用兩個(gè)字節(jié),能夠表示世界上所有的字符集,一個(gè)unicode字符占用兩個(gè)字節(jié),如果要計(jì)算字符串占用的字節(jié)數(shù)量(number of bytes),請(qǐng)使用DataLength()函數(shù),該函數(shù)統(tǒng)計(jì)字節(jié)數(shù)量時(shí),字符串的所有字符都會(huì)計(jì)算在內(nèi),包括前導(dǎo)空格和結(jié)尾空格。
示例,每個(gè)unicode字符占2B,ASCII 字符占1B。
延伸閱讀
學(xué)習(xí)是年輕人改變自己的最好方式