【问题标题】:Unable to identify strange whitespace character in MSSQL table无法识别 MSSQL 表中的奇怪空白字符
【发布时间】: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


【解决方案1】:

数据输入

数据中似乎有一些空(即 Char(0))字符。

如果数据在输入时应该是 ASCII,但得到的是 UTF-16 数据,那么它可能是:

输入的字符代码:4800
发送到数据库:48 0000 00

为避免这种情况,作为处理输入的第一步,删除不允许的字符,例如使用正则表达式将 [\x00-\x1F] 替换为空字符串。

数据修复

搜索其中包含 Char(0) 的条目以确认可以通过这种方式找到它们。

如果是这样,请将 Char(0) 替换为空字符串。

如果不工作,你可以将数据转换为格式“0x35000000320000003800000036000000380000003300000039000000370000003800000037000000330000003000000035000000340000003000000033000000”,用“00”取代“000000”,然后再转换回。 P>

【讨论】:

  • 搜索带有CHAR(0) 的条目会返回所有条目。同样,尝试用空字符串替换 CHAR(0) 也无济于事。我们正在努力确保它们不会首先进入数据库,但它正在尝试识别那里的数据库并纠正它们,这是当前的问题。
  • @anothershrubery 好吧,这很麻烦。基于您能够获得字符串的十六进制表示,我建议了另一种可能的方法。
猜你喜欢
  • 1970-01-01
  • 2018-01-05
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多