SQL Server为何截断长度匹配的RoutingNumber值?
EF Core 写入SQL Server时字符串截断问题排查
你遇到的这个问题几乎可以确定是不可见隐藏字符导致的——肉眼看到的'150199880'是9个字符,但实际字符串可能包含空格、制表符、换行符这类不可见字符,导致总长度超过了varchar(9)的限制。
排查步骤:
验证字符串实际长度与字符组成
在代码中输出目标字符串的真实长度,并打印每个字符的ASCII码,确认是否存在异常字符:var routingNumber = "150199880"; // 替换为你的实际变量 Console.WriteLine($"实际长度: {routingNumber.Length}"); foreach (char c in routingNumber) { Console.WriteLine($"'{c}' -> ASCII 码: {(int)c}"); }正常数字的ASCII码范围是48-57,如果出现32(空格)、9(制表符)、10(换行)等数值,就是隐藏字符的来源。
确认数据库列定义准确性
执行SQL语句再次验证列的实际定义,避免存在认知偏差:SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'CheckImageApiLog' AND COLUMN_NAME = 'RoutingNumber';
解决方法:
如果排查出存在隐藏字符,在写入数据库前对字符串做清理:
- 简单去除首尾空白字符:
routingNumber = routingNumber.Trim(); - 严格只保留数字字符(适用于只允许数字的路由号场景):
routingNumber = new string(routingNumber.Where(c => char.IsDigit(c)).ToArray());
内容的提问来源于stack exchange,提问作者Franky
相关产品推荐
相关产品推荐

