摘要: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 以正確儲存資料
*/