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'
在二进制排序规则中是不等价的。
我正在尝试 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'
在二进制排序规则中是不等价的。