在处理数据时,当业务数据同步至MaxCompute后,会产生一些含异常字符的脏数据,比如字段中包含了一个不可见字符,在DataWorks中显示不出来,但在BI界面又会显示成其他字符,影响整体观感。这种情况,通常我们的解法是,将异常的字符洗掉,下面来介绍几种常见的处理异常字符的方法。
如下图,可以看到“异常name”和“正常name”的 length值 不同,多了个不可见字符,但是我们并不能看出来啥。后期做数据处理或数据展示可能成为一个难以定位的问题。
SELECT
name as 异常name,
LENGTH(name) as 异常name长度,
'北京' as 正常name,
LENGTH('北京') as 正常name长度
from tbl1
where name RLIKE '北京';
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1e091I1H-1686723772034)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/72672045f01d4bdeaf5fe6a7639fe4dd~tplv-k3u1fbpfcp-zoom-1.image “image”)]
我们可以通过在线Unicode编码转换工具,将数值粘贴过去,获取到对应的Unicode码。同理也可以获取其他异常字符的Unicode码,以便后续处理。
输入异常 vs 正常的字符串,对比 Unicode 差异可以倒推不可见字符为“ \u200b” 。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9HgGte4u-1686723772037)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/889d9041412a49afbc5c8f03ec341100~tplv-k3u1fbpfcp-zoom-1.image “image”)]
方案 | 描述 | 备注 | 本case是否适用 |
---|---|---|---|
trim()函数 | 常规的首尾不可见字符处理 | 适用首尾部的空格、tab、换行 | Yes |
replace()函数 | 定向剔除字符串 | 适用于单个待替换的字符,多个需要层层嵌套 | Yes |
正则替换函数 | 定向剔除一类字符串 | 通过正则匹配符,替换一类字符串 | Yes |
效果如下:
SELECT
name as 异常name,
LENGTH(name) as 异常name长度,
trim(name,'') as 正常name,
LENGTH(trim(name,'')) as 正常name长度
from tbl1
where name RLIKE '北京';
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MV9F2WpO-1686723772039)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6330d6703d9e4cdba18c5e53df370703~tplv-k3u1fbpfcp-zoom-1.image “image”)]
效果如下:
SELECT
name as 异常name,
LENGTH(name) as 异常name长度,
replace(name,'','') as 正常name,
LENGTH(replace(name,'','')) as 正常name长度
from tbl1
where name RLIKE '北京';
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IvINn1ze-1686723772040)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e41ba7561f104d12b4c0ce7770221e30~tplv-k3u1fbpfcp-zoom-1.image “image”)]
select id,name from tbl1 where name rlike '[\x{200b}]';
结果返回:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HPnuC4vm-1686723772041)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b38941cf971e40c39bf95345ba9d1b3f~tplv-k3u1fbpfcp-zoom-1.image “image”)]
-- regexp_replace()函数
SELECT
name as 异常name,
LENGTH(name) as 异常name长度,
regexp_replace(name, '[\x{200b}]', '',0) as 正常name,
LENGTH(regexp_replace(name, '[\x{200b}]', '',0)) as 正常name长度
FROM tbl1;
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QpgDxBoy-1686723772042)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9a7ce697bbc64bbb8b9781aeff414b32~tplv-k3u1fbpfcp-zoom-1.image “image”)]
针对于SQL中的不可见字符或者其他中文等异常字符,都可以使用方案3中的筛选方式筛出来,然后再做后续的替换或其他操作就可以了。
【MaxCompute 已发布免费试用计划,为数仓建设提速】新用户可 0 元领取 5000CU*小时计算资源与 100GB 存储,有效期 3 个月。 立即领取>>
欢迎各位开发者加入大数据计算 MaxCompute 社区。立即加入