无法替换nvarchar字符串中的特殊字符

时间:2016-06-28 08:05:55

标签: sql-server sql-server-2014

我正在尝试拆分nvarchar(max)的字符串 如果我传递字符串

@String_xyz = 'abc@def#ghi$jkl'

然后我可以替换特殊字符,但我的角色有一种不可读的格式,如?????

如果我像这样发送我的字符串

@String_xyz = N'abc@def#ghi$jkl'

然后我无法替换任何特殊字符

让我们说

DECLARE @string nvarchar(max)
SET @string = 'என்$பெயர்@PIN@ஆகிறது##என்$பெயர்@KUL@ஆகிறது'
SET @string = replace(@string,'##',' ') -- This work perfect

如果

DECLARE @string nvarchar(max)
SET @string = N'என்$பெயர்@PIN@ஆகிறது##என்$பெயர்@KUL@ஆகிறது'
SET @string = replace(@string,'##',' ') -- This will not work

请告诉我任何可能的解决方案 where abc-def-ghi-jkl are multilanguage character

排序规则:SQL_Latin1_General_CP1_CI_AS

2 个答案:

答案 0 :(得分:1)

重点是 UNICODE

您必须确保在所有地方使用unicode

文字字符串必须以N 无处不在

开始

试试这个

--This will come out with question marks
SELECT 'என்$பெயர்@PIN@ஆகிறது##என்$பெயர்@KUL@ஆகிறது';
--And this is the correct output
SELECT N'என்$பெயர்@PIN@ஆகிறது##என்$பெயர்@KUL@ஆகிறது';

--Here I replace one of the characters with a "%"
SELECT REPLACE(N'என்$பெயர்@PIN@ஆகிறது##என்$பெயர்@KUL@ஆகிறது',N'கி',N'%')

这在这里工作得很好......

更新

无法再验证这一点,但可能是第一次尝试输出错误。我尝试了几种排序规则。有了这个,我得到了想要的

SELECT N'YourString' COLLATE Indic_General_90_BIN;

使用过后,没关系。所以 - 但这只是猜测 - 可能是,SQL Server必须首先学习 ......

答案 1 :(得分:0)

如果你的代码是

DECLARE @string nvarchar(max) = N'என்$பெயர்@PIN@ஆகிறது##என்
SET @string = replace(@string,'##',' ') 

结果为

என்$பெயர்@PIN@ஆகிறது என்$பெயர்@KUL@ஆகிறது

如果

DECLARE @string1 nvarchar(max) = 'என்$பெயர்@PIN@ஆகிறது##என்$பெயர்@KUL@ஆகிறது'
SET @string1 = replace(@string1,'##',' ')

然后

???$?????@PIN@?????? ???$?????@KUL@??????

如果

DECLARE @string2 varchar(max) = 'என்$பெயர்@PIN@ஆகிறது##என்$பெயர்@KUL@ஆகிறது'
SET @string2 = replace(@string2,'##',' ')

然后

???$?????@PIN@?????? ???$?????@KUL@??????

如果

DECLARE @string3 varchar(max) = N'என்$பெயர்@PIN@ஆகிறது##என்$பெயர்@KUL@ஆகிறது'
SET @string3 = replace(@string3,'##',' ') 

然后

???$?????@PIN@?????? ???$?????@KUL@??????

如果将字符串声明为nvarchar,则必须在字符串之前给出N',否则unicodes将无效。