首页 > 解决方案 > 额外的“隐藏”字符与 SQL 中的等于测试混淆

问题描述

我正在执行数据库 (Oracle) 迁移验证,并且正在编写脚本以确保目标与源匹配。我的脚本正在返回值,当您查看它们时,它们看起来相等。但是,它们不是。

例如,目标有PREAPPLICANT,源有PREAPPLICANT。当您在文本中查看它们时,它们看起来很好。但是当我将它们转换为十六进制时,它会显示50 52 45 41 50 50 4c 49 43 41 4e 54目标和50 52 45 96 41 50 50 4c 49 43 41 4e 54源。所以96十六进制中有一个额外的。

在此处输入图像描述

所以,我的问题是:

  1. 什么是96字符?
  2. 你会说目标的数据不正确,因为它没有把字符带过来吗?我意识到这个问题可能有点主观,但我是从“这个角色是什么以及它是如何来到这里的?”的角度来问这个问题的。
  3. 有没有办法在 SQL 脚本中忽略这个字符,以便通过相等性检查?(我希望平等在这里通过还是失败?)

标签: sqloracle

解决方案


看起来您在这里设置了 Windows-1252 字符集。 https://en.wikipedia.org/wiki/Windows-1252

字符 96 是一个 En Dash。这是有道理的,因为数据是预先申请的。

一位用户提供了“PREAPPLICANT”,另一位用户提供了“PRE-APPLICANT”,Windows 帮助将他们正确的破折号转换为一个破折号。

因此,这似乎不是数据错误,更像是字符集错误。您应该能够毫不费力地过滤掉这些,但是您正在更改数据。这有点像一个人输入“琼斯先生”,另一个人输入“琼斯先生”——你必须决定你想要做多少数据按摩。

正如您可能已经做过的那样,使用 DUMP 函数在您希望检查异常的代码中获取数据的字节表示。

这是一些带有纯 ASCII 的文本:

select dump('Dashes-and "smart quotes"') from dual;

Typ=96 Len=25: 68,97,115,104,101,115,45,97,110,100,32,34,115,109,97,114,116,32,113,117,111,116,101,115,34

现在介绍有趣的角色:

select dump('Dashes—and “smart quotes”') from dual;

Typ=96 Len=31: 68,97,115,104,101,115,226,128,148,97,110,100,32,226,128,156,115,109,97,114,116,32,113,117,111,116,101,115,226,128,51

在这种情况下,字节数增加了,因为我的数据库使用的是 UTF8。超出 ASCII 有效范围的数字会突出显示,可以进一步检查。

这是查看特殊字符的另一种方法:

select asciistr('Dashes—and “smart quotes”') from dual;

破折号\2014和\201Csmart报价\201D

这将非 ASCII 字符转换为反斜杠 Unicode 十六进制。


推荐阅读