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

MS SQL 2016中如何将不可见ASCII字符替换为下划线?

nvarchar列中ASCII 63字符无法替换的原因及解决方法

核心问题

你遇到的情况本质是:那个显示为小方框的字符并不是真正的ASCII 63(问号?),而是某个无法被当前数据库代码页(SQL_Latin1_General_CP1_CI_AS对应Windows-1252)识别的Unicode字符。这类字符在显示时会被系统自动替换为问号(ASCII 63),但实际存储的是另一个Unicode码点。

另外,你的替换语句用了char(63)(单字节字符类型),但目标列是nvarchar(双字节Unicode类型),隐式转换会导致匹配逻辑失效——你要替换的真实Unicode字符和char(63)根本不是同一个东西。

为什么查出来的ASCII是63?

因为ASCII()函数只能处理单字节ASCII字符,当传入无法识别的Unicode字符时,它会直接返回63(问号的ASCII码),这是函数的固有特性,并不是该字符的真实编码。

解决步骤

  1. 先获取字符的真实Unicode码点
    用UNICODE()函数代替ASCII()查询,比如定位到该字符的位置后执行:
SELECT UNICODE(SUBSTRING(C_DESCRIPT, 你找到的字符位置, 1)) AS 真实Unicode编码
FROM TableName
WHERE CUSTOM_ALIAS='272968'

如果不知道位置,可以用CHARINDEX结合NCHAR(65533)(常见的无法识别字符的Unicode码,十进制65533)先定位:

SELECT CHARINDEX(NCHAR(65533), C_DESCRIPT) AS 字符位置
FROM TableName
WHERE CUSTOM_ALIAS='272968'
  1. 用NCHAR()替换真实Unicode字符
    拿到真实编码后,用NCHAR(编码值)来替换。比如如果真实编码是65533,修改你的更新语句:
UPDATE TableName
SET C_DESCRIPT = Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(
Replace(C_DESCRIPT, NCHAR(60),'-'),NCHAR(62),'-'),NCHAR(58),'-'),NCHAR(34),'-'),NCHAR(47), '-'),
NCHAR(92),'-'),NCHAR(124),'-'), NCHAR(你的真实编码),'-'), NCHAR(42),'-')
WHERE CUSTOM_ALIAS='272968'

注意:所有替换用的字符都要改成NCHAR(),确保和nvarchar列的类型匹配,避免隐式转换问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:02:20