替换 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, 'þ', '')
,其中note
是ntext
列。关键是要去掉刺字符,因为该字符稍后会在该过程中用作列分隔符。 (请不要建议更改分隔符,考虑到它的使用程度,这不会发生!)
我尝试使用 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 字符的主要内容,如果未能解决你的问题,请参考以下文章
uGUI 文本字段,如何删除“替换字符”(uFFFD aka �)?