替换T-SQL中的Unicode字符

时间:2015-03-12 14:46:25

标签: sql sql-server tsql unicode collation

如何只替换字符串的最后一个字符:

select REPLACE('this is the news with a þ', 'þ', '__')

我得到的结果是:

__is is __e news wi__ a __

修改 服务器和数据库的排序规则为Latin1_General_CI_AS

我正在运行的实际查询是REPLACE(note, 'þ', ''),其中notentext列。重点是剥离刺字符,因为该字符后来在过程中用作列分隔符。 (请不要建议更改分隔符,考虑到它的使用程度,这不会发生!)

即使使用test select语句,我也尝试使用N前缀,结果如下:

Still broken!

2 个答案:

答案 0 :(得分:10)

þ字符(ASCII和UNICODE值254)被称为“刺”,在某些语言中直接等同于

  • 此处字符的技术信息:http://unicode-table.com/en/00FE/
  • 此处字符和排序规则的说明:http://userguide.icu-project.org/collation/customization。搜索页面 - 通常是Control-F - 用于“复杂裁缝示例”,您将看到以下内容:

      

    字母'þ'(THORN)通常由UCA / root归类处理,作为单独的字母,在'z'之后进行初级排序。但是,在瑞典语和其他一些斯堪的纳维亚语言中,“þ”和“Þ”应分别被视为与“th”和“TH”字母的三级差异。

如果您不希望þ等同于 th ,请按以下方式强制进行二进制排序规则:

SELECT REPLACE(N'this is the news with a þ' COLLATE Latin1_General_100_BIN2,
                 N'þ', N'__');

返回:

this is the news with a __

答案 1 :(得分:0)

这可能对您有用:

DECLARE @text NVARCHAR(1000) = N'this is the news with a þ';
DECLARE @find NVARCHAR(1000) = N'þ';
DECLARE @replace NVARCHAR(1000) = N'_';

SELECT REPLACE(CAST(@text AS VARCHAR), CAST(@find AS VARCHAR), CAST(@replace AS VARCHAR));