在 SQL Server 中替换更大和更小的符号时出现问题

Rob*_*her 4 sql-server unicode

也许你们中的某个人可以帮助我解决以下问题。我尝试将 SQL Server 中的更大和更小符号转换为特定的 Unicode 符号 706 (<) 和 707 (>)。

\n

当我替换“<>”时,结果是正确的(十六进制:C202 C302)

\n

但是当我尝试替换 "><" 时,结果是意外的:(十六进制:3E00 C202)

\n

也许你想尝试一下:

\n
CREATE TABLE Test (Id int, MyText nvarchar(255))\n\ninsert into Test (Id, MyText) values  (1, '<>');\ninsert into Test (Id, MyText) values  (2, '><');\n\nSELECT id, MyText, convert(varbinary, MyText) FROM Test    \n\n-- 1  <>  0x 3C00 3E00         \n-- 2  ><  0x 3E00 3C00   \n\nUPDATE Test SET MyText = REPLACE(MyText, '<', NCHAR(706)) \nUPDATE Test SET MyText = REPLACE(MyText, '>', NCHAR(707)) \n\nSELECT id, MyText, convert(varbinary, MyText) FROM Test  \n\n-- 1  \xcb\x82\xcb\x83  0x C202 C302   (correct)\n-- 2  >\xcb\x82  0x 3E00 C202   (!!! Why is the greater sign not replaced to C302 ???)\n\n
Run Code Online (Sandbox Code Playgroud)\n

感谢您的帮助。\n罗伯特

\n

use*_*983 5

我无法回答为什么这不适用于REPLACE,但是,如果您使用,TRANSLATE问题不会持续存在:

UPDATE dbo.Test SET MyText = TRANSLATE(MyText, '<>', NCHAR(706)+NCHAR(707));
Run Code Online (Sandbox Code Playgroud)

数据库<>小提琴

或者,如果您将COLLATE列设置为内部的二进制排序规则REPLACE,则替换也有效。

UPDATE dbo.Test SET MyText = REPLACE(MyText COLLATE Latin1_General_BIN, N'>', NCHAR(707));
UPDATE dbo.Test SET MyText = REPLACE(MyText COLLATE Latin1_General_BIN, N'<', NCHAR(706));
Run Code Online (Sandbox Code Playgroud)

数据库<>小提琴