暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库内处理特殊字符

一起学习SPI 2022-06-14
1526

最近处理了客户一个数字化交付项目的数据校验工作。

在位号合规性检查中,无意发现了一种很奇葩的情况。

如下面这个位号:

3410MN   1015A


看上去上述这个位号并没有什么问题,其满足单元号4位长度,仪表类型加上空格5位长度,流水号4位操作,再加后缀。

但是如果你找一个文本编辑器,去用空格做一下文本替换工作,你会发现这个“空格”还在。


经过字符编码解码后,发现这个特殊空格的编码为C2A0,而普通空格的代码就是20。

基础知识为:

C2A0是UTF8里的排版用的空格(这个空格是与ASCII、unicode中的空格是不一样的,ASCII中的空格编码是20,unicode中的空格是0xA0),但是这个特殊的字符,不在GBK字符集中。却频繁用于xml/html等格式的文件中。大量UTF-编码的网页使用这个字符用作占位的空格。


现在知道这个空格有问题,就希望在后台将此类位号数据查询出来后进行处理。


但是第一个问题就是,查询不出来,不管是在where中用=,还是like。


经过一番思考后,想到了数据库中有一个chr函数,用于将指定代码解析为对应的字符。



一开始用chr(c2a0),发现不行。

因为c2a0是十六进制,尝试变为十进制49824后,终于能让数据库查到这个特殊的空格了。


select * from COMPONENT t

WHERE T.CMPNT_NAME LIKE '%' || chr(49824) ||'%'


所以最终可以靠这样的sql语句将含有这个奇葩空格的位号查出来。

之后就可以用replace进行文本替换。

UPDATE COMPONENT

SET CMPNT_NAME=REPLACE(CMPNT_NAME,CHR(49824),' '),CMPNT_TRANS_NAME=REPLACE(CMPNT_TRANS_NAME,CHR(49824),' ')

WHERE CMPNT_NAME LIKE '%' || chr(49824) ||'%';

文章转载自一起学习SPI,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论