为什么一个有效而另一个无效?
SELECT REPLACE(N'IA?I' ,N'?','x') -- doesn't match (returns 'IA?I')
SELECT REPLACE('IA?I' ,'?','x') -- works (returns 'IAxI')
Run Code Online (Sandbox Code Playgroud)
我的猜测是在第二个示例中 SQL Server 会看到 '?' 作为 2 个字符 (0x19 02) 并且不做一些破坏多字节匹配的整理优化。
应该怎么做才能使多字节示例工作?
我无法解释为什么第一个不起作用(也许是那个特定 Unicode 字符的一些微妙之处)。这会产生一个相当意外的结果:
SELECT REPLACE(N'IA?I', N'?I', 'x') -- returns 'xA?x'
Run Code Online (Sandbox Code Playgroud)
第二个似乎可以工作,因为 SQL Server 用“?”替换了多字节字符。当转换为 varchar 时。
这个小示例演示了该行为,因为所有参数都将转换为 varchar 文字:
SELECT 'IA?I', REPLACE('IA?I', '?', 'x'), REPLACE('IA?I', '?', 'x') -- returns 'IAxI'
Run Code Online (Sandbox Code Playgroud)
编辑:似乎与整理相关。
SELECT REPLACE(N'IA?I' COLLATE Latin1_General_CI_AS, N'?', 'x') -- doesn't match (returns 'IA?I')
SELECT REPLACE(N'IA?I' COLLATE Latin1_General_Bin, N'?', 'x') -- returns 'IAxI'
Run Code Online (Sandbox Code Playgroud)