多字节替换在 SQL Server 中不起作用

Ste*_*gin 0 sql-server t-sql

为什么一个有效而另一个无效?

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) 并且不做一些破坏多字节匹配的整理优化。

应该怎么做才能使多字节示例工作?

db2*_*db2 5

我无法解释为什么第一个不起作用(也许是那个特定 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)

  • 似乎是在最近的整理中修复的东西。`Latin1_General_100_CI_AS` 返回 `'IAxI'` (2认同)