C#中视觉字符一致的字符串相等判断返回false问题排查
问题根因
相等判断返回false的核心原因是从SQL读取的业务字段包含不可见控制字符,和用于对比的手写字符串"doc"字节序列不匹配。
从ASCII码核查结果可以明确差异:
- 手写的对比字符串"doc"共3个字符,对应ASCII码依次为100(小写d)、111(小写o)、99(小写c),无额外字符。
- 数据库读取的
this.NameOfComm字段实际共4个字符,开头多了1个ASCII码为0的NUL空字符(转义表示为\0)。该字符属于不可见控制字符,不会在界面输出、文本打印时显示,因此肉眼观察两个字符串完全一致,但实际内容存在差异,相等判断必然返回false。
这类不可见字符的常见来源包括:
- 数据导入、跨系统同步时,编码转换异常残留控制字符
- 上游业务逻辑拼接字符串时未做校验,意外带入空字符
- 字符串截断、拼接操作逻辑不严谨,将控制字符一并写入数据库
修复方案
1. 清洗存量脏数据
直接在数据库层批量清除字段中残留的NUL空字符,以SQL Server为例,执行如下清洗语句:
-- 替换业务字段中所有NUL空字符 UPDATE 对应业务表 SET NameOfComm = REPLACE(NameOfComm, CHAR(0), '') WHERE CHARINDEX(CHAR(0), NameOfComm) > 0
如果使用其他数据库,替换对应函数即可:MySQL用CHAR(0)匹配空字符,PostgreSQL用CHR(0)匹配。
2. 程序读取层做兼容处理
读取数据库字段后统一过滤不可见控制字符,避免遗漏的存量脏数据影响业务判断:
/// <summary> /// 过滤字符串中的所有ASCII控制字符 /// </summary> public static string RemoveControlCharacters(string source) { if (string.IsNullOrWhiteSpace(source)) return source; return new string(source.Where(c => !char.IsControl(c)).ToArray()); } // 调用示例 this.NameOfComm = RemoveControlCharacters(dbReader["NameOfComm"].ToString());
3. 写入侧增加拦截校验
在所有数据写入数据库的业务入口增加校验逻辑,提前过滤不可见控制字符,从源头阻断脏数据入库。
内容的提问来源于stack exchange,提问作者Hadi Jahangiri
相关产品推荐
相关产品推荐

