我正在尝试从Server 2019中的文本中删除/替换某些unicode符号字符。
我使用的服务器/DB具有排序规则Latin1_General_CI_AS。
我无法更改服务器/DB的排序规则,所以我尝试了这个方法(大多数情况下,它可以工作,但是一些符号不起作用)。
环境:
Server版本:
Microsoft 2019 (RTM) (KB4583458) - 15.0.2080.9 (X64) 2020年11月6日16:50:01版权(C) 2019微软公司开发版(64位)在Windows10Pro10.0 (Build 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 (正确)
⚶(错)
有谁知道为什么替换使用一些字符/字符顺序,而有些则不工作呢?
发布于 2021-10-20 13:38:08
我建议在处理这些字符时使用二进制排序规则。非二进制校对有一个习惯,不真正“知道如何处理”,这样的字符在你的问题。另一方面,二进制字符可以很好地处理它们,因为每个字符都被视为一个明显不同的字符:
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'在二进制排序规则中并不等价。
https://stackoverflow.com/questions/69646937
复制相似问题