我正在嘗試從 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 著作權所有 (C) 2019 Microsoft Corporation Developer Edition (64-bit) o??n Windows 10 Pro 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?(錯誤)
有沒有人知道為什么替換適用于某些字符/字符順序,而有些則不起作用?
uj5u.com熱心網友回復:
我建議在處理這些字符時使用二進制排序規則。非二進制排序規則有一個習慣,即不真正“知道如何處理”像您問題中的字符這樣的字符。另一方面,二進制檔案與它們配合得很好,因為每個字符都被視為截然不同的字符:
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://www.uj5u.com/caozuo/329778.html
標籤:sql-server 代替 统一码 无功字符 sql-server-排序规则
下一篇:進入遞回前的初始命令
