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码),这是函数的固有特性,并不是该字符的真实编码。
解决步骤
- 先获取字符的真实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'
- 用
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
相关产品推荐
相关产品推荐

