sql - 额外的“隐藏”字符与 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
十六进制中有一个额外的。
所以,我的问题是:
- 什么是
96
字符? - 你会说目标的数据不正确,因为它没有把字符带过来吗?我意识到这个问题可能有点主观,但我是从“这个角色是什么以及它是如何来到这里的?”的角度来问这个问题的。
- 有没有办法在 SQL 脚本中忽略这个字符,以便通过相等性检查?(我希望平等在这里通过还是失败?)
解决方案
看起来您在这里设置了 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 十六进制。
推荐阅读
- react-native - 访问 StyleSheet.create 中组件状态中定义的变量?(未定义不是一个对象(评估'this.state.filterMenuHeight'))
- javascript - 在 p5.js 中使用 audiocontext 作为音频输入
- r - 在R中将字符转换为数字
- javascript - 如何将数字从 html 添加到自定义数据属性
- android - 在 MutableLiveData 中保存来自 EventListener 的数据
- python - “未关闭的客户会话”
- function - react native 摆脱商店中不必要的方法
- php - 调用未定义的方法 PDO::fetchAll()
- batch-file - 来自单个 ECHO 命令的连接文本文件输出将字符插入到预期输出后第二次打印的字符串中
- spring-boot - 为什么 Sleuth 在我的 Spring Boot 服务中不能与 Log4j2 一起使用