1

我正在尝试从 SQL Server 2019 中的文本中删除/替换某些 unicode 符号字符。
我正在使用的服务器/数据库具有排序规则 Latin1_General_CI_AS。
我无法更改服务器/数据库的排序规则,所以我尝试了这个(大多数情况下它可以工作,但有些符号不起作用)。

环境:
SQL Server 版本:
Microsoft SQL Server 2019 (RTM-GDR) (KB4583458) - 15.0.2080.9 (X64) Nov 6 2020 16:50:01 Copyright (C) 2019 Microsoft Corporation Developer Edition (64-bit) o​​n 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⚶(错误)

有谁知道为什么替换适用于某些字符/字符顺序,而有些则不行?

4

1 回答 1

0

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

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'也不等效。

于 2021-10-20T13:38:08.190 回答