起因
某天,接到一个用户需求,varchar字段中有一些重复数据使用SQL查重时,明明数据是一样的,但是SQL还是将数据区分出来,影响了后续交易的正常执行。
在仔细检查数据后,发现数据中存在大量的不可见字符,导致了数据唯一行排查结果没有符合预期。
复现
创建测试表
--创建测试表
create table t3 (id varchar);
--插入正常数据
insert into t3 select '123456';
insert into t3 select '123456';
--插入末尾带'空格'数据
insert into t3 select '123456 ';
--插入末尾带'制表符'数据
insert into t3 select E'123456\t';
检查数据重复率
通过查重SQL可以发现id数据显示一致,但是在count列中发现将数据进行了筛选,分为了三种不同的数据(符合预期)。
select id,count(*) from t3 group by id;

转换为字符,并查看数据间区别
对于以上问题,我们可以将数据转换为16进制字符,清晰的查看数据之间的不同
select id,id::bytea id_code,count(*) from t3 group by id,id_code;

通过转换后,可以发现id_code第一行数据末尾多了一个acsii(09)字符,对应制表符

id_code第二行数据末尾多了一个acsii(20)字符,对应空格

总结及拾遗:
本文通过不可见字符的转码查询,处理了肉眼一致数据的查重失败问题。同时,转码查询也可以用于乱码检查,copy分隔符不可见字符等问题场景处理。
转码也是一种对于乱码,不可见字符等问题根因排查的各类型数据库通用处理方法。
字码查询:
可以使用下面两个网站在线查询码和汉字的对应关系:
https://www.toolhelper.cn/EncodeDecode/EncodeDecode
https://www.qqxiuzi.cn/bianma/zifuji.php
ascii码查询:
可以根据下面的图片查看字符对应的ascii码:

最后修改时间:2024-06-19 10:39:00
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




