在T-SQL中替换Unicode字符

6

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

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

我收到的结果是:
__is is __e news wi__ a __
编辑: 服务器和数据库的排序规则为Latin1_General_CI_AS。
我实际运行的查询是REPLACE(note, 'þ', ''),其中note是一个ntext列。重点是要去掉thorn字符,因为该字符稍后会用作列分隔符。(请不要建议更改分隔符,考虑到其使用程度,这种情况是不可能发生的!)
我尝试过使用N前缀,即使是在测试选择语句中,以下是结果: Still broken!

我在 MS SQL 上运行了这个查询,结果显示为“这是带有 __ 的新闻”。 - SelvaS
尝试使用SELECT REPLACE(N'this is the news with a þ', 'þ', '__')语句--这不是答案,仅供注释。 - Dmitrij Kultasev
3
  1. 你没有使用 Unicode,因为你没有在任何字符串前面加大写的 N
  2. 你的数据库默认排序规则是什么?
  3. 如果运行以下代码,你将得到你在问题中展示的结果:SELECT REPLACE(N'this is the news with a þ', N'þ', N'__');
- Solomon Rutzky
这取决于您当前数据库的排序规则 - 当我尝试时,我得到了 this is the news with a __ - codeulike
2个回答

12

字符þ(通过ISO-8859-1和ANSI Code Page 1252的Extended ASCII,以及UNICODE值254)被称为“thorn”,在某些语言中等同于th

  • 该字符的技术信息在此处:http://unicode-table.com/en/00FE/

  • 关于该字符和排序规则的解释在此处:http://userguide.icu-project.org/collation/customization。搜索页面 - 通常使用Control-F - 找到“Complex Tailoring Examples”并查看以下内容:

    字母'þ'(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 __

如需有关使用排序规则、Unicode、编码等方面的更多信息,请访问:排序规则信息


ASCII没有代码点254,也没有字符þ。如果你执行SELECT name, collation_name, COLLATIONPROPERTY(collation_name, N'CodePage') FROM master.sys.databases,如果你看到列出的是代码页20127(或367),我会感到惊讶。 - Tom Blodget
@TomBlodget 嗯,严格来说,ASCII标准只包括0-127。但实际上,在8859-1 Latin1 / ANSI Code Page 1252中,该字符为254。 - Solomon Rutzky
@TomBlodget 由于某种原因,我在五年后又偶然看到了这篇文章,在重新阅读后,我认为我理解了你的观点。我之前认为“ASCII”本身就可以了,因为很多人都是这么说的,但现在我觉得我不应该帮助延续那种误用/过度简化的情况。因此,我进行了更新以澄清我所指的是扩展ASCII而不是标准ASCII。 - Solomon Rutzky

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));

3
请注意,使用可变长度数据类型时必须指定其长度。根据使用场景的不同,有两种默认长度--1或30。请记住遵循此规则。 - Solomon Rutzky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接