You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中REPLACE替换²为何误替换数字2?

问题原因与解决办法

这是SQL Server排序规则的字符等价特性导致的异常,具体分析如下:

核心原因

部分SQL Server排序规则(比如常见的SQL_Latin1_General_CP1_CI_AS、Latin1_General_CI_AS等)会将普通数字2(ASCII码0x32)和Unicode上标字符²(U+00B2)判定为语义相等的匹配字符。这类排序规则为了实现更宽松的文本比较,会忽略字符的格式差异(如上标、下标、重音),把它们视为同一个字符。

当你的函数里执行REPLACE(..., '²', ' ')时,函数的默认排序规则(可能继承自数据库或列的排序规则)触发了这个等价匹配,导致所有被判定为和²相等的字符(包括普通2)都被替换成了空格。而你单独执行替换语句时,可能会话的排序规则更严格,或者测试上下文没有触发这个等价匹配,所以看起来结果正常。

验证方法

你可以执行下面的语句验证这个等价性:

-- 测试不同排序规则下的字符匹配
SELECT 
    CASE WHEN '2' = '²' COLLATE SQL_Latin1_General_CP1_CI_AS THEN '排序规则将2和²视为相等' ELSE '不相等' END AS 测试结果1,
    CASE WHEN '2' = '²' COLLATE Latin1_General_BIN2 THEN '排序规则将2和²视为相等' ELSE '不相等' END AS 测试结果2;

执行后会发现,第一列返回“排序规则将2和²视为相等”,第二列返回“不相等”——因为二进制排序规则Latin1_General_BIN2是严格按字符的Unicode码点匹配的。

解决办法

在REPLACE操作时指定二进制排序规则,强制精确匹配字符的原始码点,避免等价替换:

-- 修改后的REPLACE语句
REPLACE(your_input_string, '²' COLLATE Latin1_General_BIN2, ' ')

这样只会替换真正的上标²,不会影响普通数字2。

内容的提问来源于stack exchange,提问作者arthur wajsbrot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:02:33