【发布时间】:2019-03-28 20:37:00
【问题描述】:
我们有一个进程将 XML 文件读入我们的数据库,并将当前不在另一个表中的任何行插入到该表中。
这个过程还有一个写入审计表的触发器,并且每晚的快照也保存在另一个表中。
在 XML 保存表中,字段看起来像 1234567890123456,但它在我们的活动表中以 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 存在。 REPLACE 函数的任何组合都不会删除这些空格。我们已经尝试了所有CHAR 值,但它无法识别该字符。但是,审计表和夜间快照包含正确的值。
同样,如果我们在SELECT CASE WHEN '1234567890123456' = '1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 ' THEN 1 ELSE 0 END 之间进行比较,则返回 1,因此它们匹配。但是LEN('1234567890123456') 是 16,LEN('1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 ') 是 32。
我们已经运行了一些查询来遍历字段中的字符并输出字符的 ASCII 和 Unicode 值。数字返回正确的 ASCII/Unicode 值,但这个随机空白字符不返回值。
错误显示的示例是0x35000000320000003800000036000000380000003300000039000000370000003800000037000000330000003000000035000000340000003000000033000000,正确的示例是0x3500320038003600380033003200300030003000360033003600380036003000。两者都是在同一天以相同的方式添加的。一个有多余的字节,另一个很好。
我们如何识别这个角色并摆脱它?最初插入它是否有原因?我们以后如何避免这种情况?
【问题讨论】:
-
可以使用
ASCII()函数查看hte字符的ASCII值是多少。 -
@GordonLinoff 正如我所提到的,我们已经遍历了字符串中的每个字符并针对它运行
ASCII()。数字返回了正确的值,这些空格什么也没返回。 -
如果只是数字,你可以使用this
-
您可以尝试的一个实验是使用
convert函数将文本转换为 varchar 并查看您会得到什么。 -
你确定它是空格而不只是 unicode 吗?你如何显示价值?它是
varchar列而不是nvarchar或类似的吗?
标签: sql sql-server ascii non-ascii-characters