NVarchar欄位編碼

  • 4529
  • 0

摘要:NVarchar欄位編碼

 /*

MS SQL 的unicode 為ucs2編碼,以固定2byte儲存資料

在非unicode datatype的情況下EX:char,varchar,varhcar(max)

字串儲存時的編碼決定於欄位的定序

    Ex:Chinese_Taiwan_Stroke_CI_AS,此時英、數、符號為單位元組儲存

在unicode datatype的情況下,EX:nchar,nvarchar,nvarhcar(max),儲存字串資料時的編碼則採UCS2編碼,

此時英、數、符號為雙位元組儲存

*/

--test

----伺服器定序

select serverproperty('collation')--Chinese_Taiwan_Stroke_CI_AS

---A:英、數、符號

declare @var varchar(6),

        @nvar nvarchar(6)

set @var='ab12@#'

set @nvar=N'ab12@#'

select @var,datalength(@var)  --結果:ab12@#  6字元6byte

select @nvar,datalength(@nvar)--結果:ab12@#  6字元12byte

/*同樣的字串資料unicode datatype存取時要用兩倍的I/O*/

 

---B:雙位元組文字:在一般繁中定序EX:Chinese_taiwan_stroke 對應的字碼頁為950  Traditional Chinese Big5

---絕大多數繁中皆可正確儲存,但也有例外(EX:喆、堃.....)

declare @var varchar(12),

        @nvar nvarchar(12)

--b1:中文

set @var='王力宏'

set @nvar=N'王力宏'

select @var,datalength(@var)  --結果:王力宏   6byte

select @nvar,datalength(@nvar)--結果:王力宏   6byte

 

 

--b2:中文特殊字

set @var='陶喆與游錫堃'

set @nvar=N'陶喆與游錫堃'

select @var,datalength(@var)  --結果:陶?與游錫?   10byte

select @nvar,datalength(@nvar)--結果:陶喆與游錫堃12byte

 

--b3:多國文字混合

set @var='車太炫문제를'

set @nvar=N'車太炫문제를'

select @var,datalength(@var)  --結果:車太炫???     9byte

select @nvar,datalength(@nvar)--結果:車太炫문제를  12byte

 

/*結論:

b1:就存取資料時I/O的量是相同的

b2、b3:若你的欄位字串資料內有多國文字混合ex:中韓混或是有特殊字元、特殊符號時,可採用unicode的datetype 以正確儲存資料

*/