数仓GaussDB (DWS) 字符串、二进制、十六进制互转

概述

现网中遇到很多小伙伴不清楚字符串与进制之间的转换方法,其实在 GaussDB (DWS) 中,进制转换是非常方便的。这次就来对不同的场景一一进行解析,整理出来供大家翻阅参考。

字符串 & 二进制 互转

# 字符串转二进制,使用类型转换
select bytea('华为'::text);
select '华为'::text::bytea;
select cast('华为'::text as bytea);
     bytea
----------------
 \xe58d8ee4b8ba
(1 row)

# 二进制转字符串,使用convert_from,第二个参数为编码
select convert_from('\xe58d8ee4b8ba'::bytea,'utf8');
 convert_from
--------------
 华为
(1 row)

二进制 & 十六进制 互转

# 二进制转十六进制,可以使用encode,
select encode('\xe58d8ee4b8ba'::bytea,'hex');
     hex
--------------
 e58d8ee4b8ba
(1 row)

# 十六进制转二进制,820版本可以使用unhex,低于820版本可以使用decode
select unhex('e58d8ee4b8ba'::text);
     unhex
----------------
 \xe58d8ee4b8ba
(1 row)

select decode('e58d8ee4b8ba'::text,'hex');
     decode
----------------
 \xe58d8ee4b8ba
(1 row)

字符串 & 十六进制 互转

# 字符串转十六进制,820版本可以使用hex,低于820版本可以使用encode
select hex('华为'::text);
     hex
--------------
 E58D8EE4B8BA
(1 row)

select encode('华为'::text::bytea, 'hex');
    encode
--------------
 e58d8ee4b8ba
(1 row)

# 十六进制转字符串,需先将十六进制转换为二进制,再转为字符串
select convert_from(unhex('E58D8EE4B8BA'),'utf8');
 convert_from
--------------
 华为
(1 row)

注意事项:

1,hex/unhex 是 820 版本新增的一组十六进制的编码 / 解码函数,低于 820 版本需使用 encode/decode 函数替代。

hex 行为与 mysql 数据库保持一致,输出全大写的十六进制字符串;encode 输出的是全小写的十六进制字符串;对大小写有要求的小伙伴可以选择满足要求的函数,但实际在解析时是没有影响的。

select hex('华为'::text);
     hex
--------------
 E58D8EE4B8BA
(1 row)

select encode('华为'::text::bytea, 'hex');
    encode
--------------
 e58d8ee4b8ba
(1 row)

2,在将二进制转为字符串的时候使用 convert_from,第二个参数为源数据编码。

需要注意的是,一定保证源数据编码正确,否则就会产生非预期的结果,甚至报错。

像这样

# 源数据编码为utf8,但解析时错误指定为gbk
select convert_from(unhex('E58D8EE4B8BA'),'gbk');
 convert_from
--------------
 鍗庝负
(1 row)

这样

# 源数据编码为gbk,但解析时错误指定为utf8
select convert_from(unhex('bbaaceaa'),'utf8');
ERROR:  invalid byte sequence for encoding "UTF8": 0xbb
CONTEXT:  referenced column: convert_from

知识小结

转换函数 encode

encode(data bytea, format text)
描述:将二进制数据编码为文本数据。
返回值类型:text

SELECT encode('database', 'base64');
  encode  
----------
 ZGF0YWJhc2U=
(1 row)

decode(string text, format text)
描述:将二进制数据从文本数据中解码。
返回值类型:bytea

SELECT decode('ZGF0YWJhc2U=', 'base64');
    decode    
--------------
 \x6461746162617365
(1 row)

转换函数 convert_from

convert_from(string bytea, src_encoding name)
描述:以数据库的编码方式转化字符串bytea。
src_encoding指定源编码方式,在该编码下,string必须是合法的。
返回值类型:text

SELECT convert_from('\x6461746162617365','gbk');
 convert_from
--------------
 database
(1 row)

转换函数 hex/unhex,需 820 或以上版本

hex(n)
描述:n可以是int类型也可以是字符串。返回n的十六进制字符串。若参数含有NULL值,返回NULL。
返回值类型:text

SELECT hex('abc') as result;
 result
--------
 616263
(1 row)

unhex(n)
描述:执行hex(n)的反向操作,n可以是int类型也可以是字符串,将参数中的每一对十六进制数字理解为一个数字,并将其转化为该数字代表的字符。若参数含有NULL值,返回NULL。
返回值类型:bytea

SELECT unhex('616263') as result;
  result
----------
 \x616263
(1 row)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自橙一派

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值