首页 > 其他分享 >教你如何进行数仓字符串、二进制、十六进制互转

教你如何进行数仓字符串、二进制、十六进制互转

时间:2022-12-08 11:45:05浏览次数:63  
标签:十六进制 convert 数仓 text hex 互转 select row

本文分享自华为云社区《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)

 

点击关注,第一时间了解华为云新鲜技术~

标签:十六进制,convert,数仓,text,hex,互转,select,row
From: https://www.cnblogs.com/huaweiyun/p/16965660.html

相关文章

  • 看场景、重实操,实时数仓不是“纸上谈兵”
    本文转载自阿里云Hologres产品负责人合一在ITPUB的访谈,谈谈他眼中的实时数仓​​​​这两年,企业IT领域掀起实时数仓热潮。然而,只要稍做梳理就会发现,实时数仓格局未定,各种流......
  • 单色位图、颜色(色彩)位图相互转换
    TheSetBkColorfunctionsetsthecurrentbackgroundcolortothespecifiedcolorvalue,ortothenearestphysicalcolorifthedevicecannotrepresentthespec......
  • 大数据数仓体系中如何玩转各种开源工具或技术
    在从离线到实时化发展的过程中,大数据领域出现了很多优秀的系统以应对各种不同的分析和查询场景。1.比如我们可以将实时的数据归档到像Hive这样的离线数仓里进行数据的离线......
  • 实时数仓原来如此:Kafka+Flink+Hudi
    原来使用kafka消费者直接进行mysql数据同步,现在发现当时只考虑了数据的同步,对于后续数据的存储和使用没有考虑全面。面对大量流式数据,面向的是应用,数据同步之后,数据如何存......
  • Java数组和字符串的相互转换
    Java数组和字符串的相互转换字符串转换为数组JavaString类中的toCharArray()方法将字符串转换为字符数组,具体代码如下所示。Stringstr="123abc";char[]arr=......
  • 大数据-数据仓库-实时数仓架构分析
    数仓分层分层全称译名说明压缩列式存储分区ODSOperationDataStore原始层原始数据✅❌✅DIMDimension维度层合并维度表✅✅✅DWDDat......
  • js 字符串与ArrayBuffer互转
    1.情景展示在js当中,如何将字符串转成ArrayBuffer?如何将ArrayBuffer转成字符串?2.字符串转ArrayBuffer/***将类型化数组转字符串Int8Array:8位有符号整数,长度1个字......
  • MyBatis ORA-01465: 无效的十六进制数字
    MyBatis在插入Oralce时报:ORA-01465:无效的十六进制数字解决方法:#插入或更新时String->BLOB字段:RAWTOHEX(#{字段名})String->DATE:to_date(#{字段名},'yyyy-mm-......
  • 基本数据类型、包装类、String三者之间的相互转换
    基本数据类型、包装类、String三者之间的相互转换 packagecom.atguigu.java2;​importorg.junit.Test;​/*  包装类的使用:  1.java提供了8种基本数据类型对应......
  • 四种触发器的相互转换
    触发器的转换往往要增加组合电路转换方法①比较法(比较状态方程,找出转换关系)更直接②卡诺图法(转换前触发器的激励→转换后输入输出,用卡诺图化简) D-Data $Q_{n+1}=D......