mssql 中文字元處理(字元集編碼和排序規則)
sqlserver中文處理涉及到字元集編碼和排序規則,是個非常糾結的問題。
sql code
--ascii字元
select n,x=cast(n as binary(2)),u=Nchar(n) from nums where n between 32 and 126
--unicode中文字元
select n,x=cast(n as binary(2)),u=Nchar(n) from nums where n between 19968 and 40869
19968 0x4e00 一
40869 0x9fa5
--以下兩個條件用來判斷字串是否包含漢字
like n'%[-]%' collate chinese_prc_ci_as
like n'%[一-]%' collate chinese_prc_bin
--這是因為在以上兩種不同的排序規則下,漢字的排列順序是不同的。
--中文全形標點符號
select n,x=cast(n as binary(2)),uq=Nchar(n),ub=Nchar(n-65248) from nums where n between 65281 and 65374
select Nchar(12288),Nchar(32)
65281 0xff01 ! !
65374 0xff5e ~ ~
--以下條件用來判斷字串是否包含全形標點
like n'%[! -~]%' collate chinese_prc_bin
全形半形標點的轉換:
sql code
--full2half
create function [dbo]. [full2half] (
@string Nvarchar(max)
)
returns Nvarchar(max)
as
/*
全形(fullwidth)轉換為半形(halfwidth)
*/
begin
declare @chr Nchar(1)
declare @i int
set @string = replace(@string,n' ',n' ')
set @i = patindex(n'%[! -~]%' collate latin1_general_bin,@string)
while @i > 0
begin
set @chr = substring(@string,@i,1)
set @string = replace(@string,@chr,Nchar(unicode(@chr)-65248))
set @i = patindex(n'%[! -~]%' collate latin1_general_bin,@string)
end
return @string
end
go
create function [dbo]. [half2full] (
@string Nvarchar(max)
)
returns Nvarchar(max)
as
/*
半形(halfwidth)轉換為全形(fullwidth)
*/
begin
declare @chr Nchar(1)
declare @i int
set @string = replace(@string,n' ',n' ')
set @i = patindex(n'%[!-~]%' collate latin1_general_bin,@string)
while @i > 0
begin
set @chr = substring(@string,@i,1)
set @string = replace(@string,@chr,Nchar(unicode(@chr)+65248))
set @i = patindex(n'%[!-~]%' collate latin1_general_bin,@string)
end
return @string
end
go