Snowflake中十六进制转字符串时如何去除特殊字符获取正确结果
问题分析
你给出的十六进制串可拆分为两段:
- 前缀控制段:
01 01 0E 00 0E,解码后对应两个不可见ASCII控制字符(0E为移位输出控制符,就是你输出里对应的编码) - 有效内容段:
43 00 55 00 52 00 52 00 45 00 4E 00 54 00,属于UTF-16LE编码的CURRENT字符串,每个字符占2字节、低字节在前。
之前直接用hex_decode_string解码是默认按单字节编码转换,既保留了前缀的控制字符,也把UTF-16的00字节识别为空字符,因此输出异常。
解决方案(适配你当前使用的Snowflake SQL语法)
方案1:正则过滤所有不可见控制字符
适配前缀控制字符不固定的场景,解码后直接过滤所有ASCII码小于空格的控制字符即可:
select REGEXP_REPLACE( hex_decode_string(to_varchar('01010E000E430055005200520045004E005400')), '[\\x00-\\x1F]', '' ) as clean_result;
执行后输出为纯字符串CURRENT。
方案2:截取有效十六进制段按正确编码转码
已知前缀固定占前10个十六进制字符(对应5字节)的情况下,直接截掉前缀后按UTF-16LE编码转码,结果更精准:
select CONVERT_FROM( HEX_DECODE_BINARY(SUBSTR('01010E000E430055005200520045004E005400', 11)), 'UTF16LE' ) as clean_result;
如果你使用的是其他数据库,核心思路一致:要么解码后过滤控制字符,要么截取有效内容段后按UTF-16LE编码转码,仅对应函数名存在差异。
内容的提问来源于stack exchange,提问作者user16595206
相关产品推荐
相关产品推荐

