SQL 服务器 Unicode 字符替换

SQL Server Unicode character replacement

我正在尝试 remove/replace SQL Server 2019 中文本中的某些 unicode 符号字符。
我正在使用的 server/DB 具有排序规则 Latin1_General_CI_AS.
我无法更改 server/DB 的排序规则,所以我尝试了这个(大部分时间都有效,但有些符号不起作用)。

环境:
SQL 服务器版本:
Microsoft SQL Server 2019 (RTM-GDR) (KB4583458) - 15.0.2080.9 (X64) 2020 年 11 月 6 日 16:50:01 版权所有 (C) 2019 Microsoft Corporation Developer Edition(64 位)在 Windows 10 专业版 10.0(内部版本 19041:)

服务器排序规则:Latin1_General_CI_AS
数据库整理:Latin1_General_CI_AS

此示例按预期工作:

select replace(N'☋a' collate Latin1_General_100_CI_AI_SC, N'☋' collate Latin1_General_100_CI_AI_SC, N'XXX')
select replace(N'a☋' collate Latin1_General_100_CI_AI_SC, N'☋' collate Latin1_General_100_CI_AI_SC, N'XXX')

输出:
XXXa
aXXX

此示例仅在 unicode 符号 (⚶) 是第一个字符时有效,但如果另一个字符位于它之前则无效:

select replace(N'⚶a' collate Latin1_General_100_CI_AI_SC, N'⚶' collate Latin1_General_100_CI_AI_SC, N'XXX')
select replace(N'a⚶' collate Latin1_General_100_CI_AI_SC, N'⚶' collate Latin1_General_100_CI_AI_SC, N'XXX')

输出:
XXXa(正确)
a⚶(错误)

有没有人知道为什么替代品适用于某些 characters/character 订单,而某些却不能?

我建议在处理此类字符时使用二进制排序规则。非二进制排序规则习惯于不真正“知道如何处理”您问题中的此类字符。另一方面,二进制字符与它们配合得很好,因为每个字符都被视为一个截然不同的字符:

SELECT REPLACE(N'⚶a' COLLATE Latin1_General_100_BIN2, N'⚶' COLLATE Latin1_General_100_BIN2, N'XXX');
SELECT REPLACE(N'a⚶' COLLATE Latin1_General_100_BIN2, N'⚶' COLLATE Latin1_General_100_BIN2, N'XXX');

但是请注意,如果您希望 N'⚶A' 被替换,它不会被替换,因为 'A''a' 在二进制排序规则中是不等价的。