SQL Server表ASCII异常字符检测及SSIS导出故障排查
检测SQL表中非常规字符的方法
背景说明
你遇到的菱形问号是字符编码不匹配导致的无效字符,通常是数据存储时字符集不一致(比如ASCII字段存入了Unicode字符,或反向操作)引发的乱码。以下是几种直接用SQL查询检测这类非常规字符的方法:
方法1:快速定位含非常规字符的记录(ASCII字段)
如果你的字段是varchar类型,用PATINDEX匹配所有不在ASCII可打印范围(空格到波浪线,ASCII 32-126)的字符:
SELECT CUST_NAME, * FROM YourTableName WHERE PATINDEX('%[^ -~]%', CUST_NAME) > 0
这个查询会直接返回所有包含控制字符、乱码字符的记录。
方法2:精准定位具体异常字符及位置
如果需要明确每条记录里到底是哪个位置的字符出问题,可以用数字序列拆分字段逐个检查:
SELECT CUST_NAME, SUBSTRING(CUST_NAME, n, 1) AS 异常字符, ASCII(SUBSTRING(CUST_NAME, n, 1)) AS 字符ASCII值, n AS 字符位置 FROM YourTableName CROSS JOIN ( -- 生成1到1000的数字序列,可根据字段最大长度调整TOP值 SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS n FROM sys.all_columns ) AS 数字序列 WHERE n <= LEN(CUST_NAME) AND ASCII(SUBSTRING(CUST_NAME, n, 1)) NOT BETWEEN 32 AND 126 ORDER BY YourTableName.主键字段, n
执行后会列出每条异常记录里的具体异常字符、它的ASCII值和所在位置,方便你针对性修复。
方法3:针对Unicode字段(nvarchar类型)的查询
如果字段是nvarchar类型,需要用Unicode模式匹配,避免字符转换导致的误判:
SELECT CUST_NAME, * FROM YourTableName WHERE CUST_NAME LIKE N'%[^' + NCHAR(32) + '-' + NCHAR(126) + N']%'
额外提示
- 先确认字段的字符类型(
varchar/nvarchar),选择对应的查询方法 - 如果明确异常字符的原始值(比如你遇到的单引号),可以用
REPLACE替换,但操作前务必备份数据 - SSIS导出时也可配置错误处理规则(比如跳过异常记录、替换无效字符),但从源数据修复是更彻底的解决方案
内容的提问来源于stack exchange,提问作者Johnny Bones
相关产品推荐
相关产品推荐

