我们有一个将XML文件读入我们的数据库并将当前不在另一个表中的行插入到该表中的过程。
此过程还触发了写入审计表的触发器,并且夜间快照也保存在另一个表中。
在XML保留表中,一个字段看起来像Data
,但在我们的活动表中却以1234567890123456
的形式存在。 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
函数的任何组合都不会删除这些空格。我们已经尝试了所有REPLACE
值,但不能识别该字符。但是,审核表和夜间快照包含正确的值。
类似地,如果我们在CHAR
之间进行比较,则返回1,因此它们匹配。但是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
是16,而LEN('1234567890123456')
是32。
我们进行了一些查询,以遍历字段中的字符并输出字符的ASCII和Unicode值。数字返回正确的ASCII / Unicode值,但是此随机空白字符不会返回值。
一个错误显示的示例是LEN('1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 ')
,一个正确显示的示例是0x35000000320000003800000036000000380000003300000039000000370000003800000037000000330000003000000035000000340000003000000033000000
。两者在同一天以相同的方式添加。一个有多余的字节,另一个很好。
我们如何识别并摆脱这个角色?是否有理由将其原本插入?将来如何避免这种情况?
答案 0 :(得分:1)
数据输入
数据中似乎插入了一些空字符(即Char(0))。
如果在输入数据时假定该数据为ASCII,但获得了UTF-16数据,则可能为:
输入的字符代码:48
00
发送到数据库:48 00
00 00
为避免这种情况,请在处理输入的第一步中删除不允许的字符,例如,使用正则表达式将[\ x00- \ x1F]替换为空字符串。
数据修复
搜索其中包含Char(0)的条目,以确认可以通过这种方式找到它们。
如果是,则用空字符串替换Char(0)。
如果这不起作用,则可以将数据转换为格式“ 0x35000000320000003800000036000000380000003300000039000000370000003800000037000000330000003000000035000000340000003000000033000000”,将“ 000000”替换为“ 00”,然后再转换回去。