Rob*_*her 4 sql-server unicode
也许你们中的某个人可以帮助我解决以下问题。我尝试将 SQL Server 中的更大和更小符号转换为特定的 Unicode 符号 706 (<) 和 707 (>)。
\n当我替换“<>”时,结果是正确的(十六进制:C202 C302)
\n但是当我尝试替换 "><" 时,结果是意外的:(十六进制:3E00 C202)
\n也许你想尝试一下:
\nCREATE 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\nRun Code Online (Sandbox Code Playgroud)\n感谢您的帮助。\n罗伯特
\n我无法回答为什么这不适用于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)