替换 T-SQL 中的 Unicode 字符

Posted

技术标签:

【中文标题】替换 T-SQL 中的 Unicode 字符【英文标题】:Replace Unicode characters in T-SQL 【发布时间】:2015-05-14 19:00:55 【问题描述】:

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

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

我得到的结果是:

__is is __e news wi__ a __

编辑 服务器和数据库的排序规则是Latin1_General_CI_AS

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

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

【问题讨论】:

我在 MS SQL 上运行了这个查询,结果为this is the news with a __ 尝试选择 REPLACE(N'this is the news with a þ', 'þ', '__') -- 这不是答案,它只适用于 cmets 1) 您没有使用 Unicode,因为您没有在任何这些字符串前面加上大写 N。 2)你的数据库默认排序规则是什么? 3)如果您运行以下命令,您将得到问题中显示的结果:SELECT REPLACE(N'this is the news with a þ', N'þ', N'__'); 这取决于您当前数据库的排序规则 - 当我尝试它时,我得到 this is the news with a __ 【参考方案1】:

þ 字符(扩展 ASCII 通过 ISO-8859-1 和 ANSI 代码页 1252 & UNICODE 值为 254)被称为“刺”,在某些语言中直接等同于

此角色的技术信息:http://unicode-table.com/en/00FE/

此处对该字符和排序规则的解释:http://userguide.icu-project.org/collation/customization。在页面(通常是 Control-F)搜索“复杂剪裁示例”,您将看到以下内容:

字母 'þ' (THORN) 通常被 UCA/根排序规则视为一个单独的字母,在 '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、编码等的更多信息,请访问:Collations Info

【讨论】:

ASCII 没有代码点 254 也没有 þ 字符。如果你去SELECT name, collation_name, COLLATIONPROPERTY(collation_name, N'CodePage') FROM master.sys.databases,如果你看到列出的代码页 20127(或 367),我会感到惊讶。 @TomBlodget 嗯,是的,严格来说,正确的 ASCII 只是 0 - 127。但实际上,这个字符在 8859-1 Latin1 / ANSI Code Page 1252 中是 254。 @TomBlodget 出于某种原因,我在 5 年后再次偶然发现了这一点,在重新阅读它时,我想我明白了你的观点。我认为之前我觉得“ASCII”单独是可以的,因为很多人都这么谈论它,但现在我觉得我不应该帮助延续这种滥用/过度简化。因此,我更新以澄清我的意思是扩展 ASCII 而不是标准 ASCII。【参考方案2】:

这可能对你有用:

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

【讨论】:

仅供参考,您不应该在未指定长度的情况下使用可变长度数据类型。有两种不同的默认值 --1 或 30 -- 取决于使用的位置。

以上是关于替换 T-SQL 中的 Unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL 同时替换字符串中的两个值

替换给定 unicode 字符串中的所有表情符号

t-sql 用户定义函数,用表中的查找替换文本

uGUI 文本字段,如何删除“替换字符”(uFFFD aka �)?

通过 Windows 批处理文件将字符串替换为文本文件中的 unicode

如何替换我只有 unicode 表示的字符?