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

如何,进行,字符串,二进制,十六进制,互转 · 浏览次数 : 139

小编点评

**字符串与二进制之间的转换方法** **字符串转二进制** * 使用 `bytea('华为'::text)` 或 `select '华为'::text::bytea` 来将字符串转换为字节数组。 **二进制转字符串** * 使用 `convert_from` 函数将字节数组转换为字符串,第二个参数为编码。 * 例如,`convert_from('\\xe58d8ee4b8ba'::bytea,'utf8'` 将字节数组 `\xe58d8ee4b8ba` 转化为字符串 "华为"。 **十六进制转字符串** * 使用 `encode` 函数将字节数组转换为十六进制字符串。 * 例如,`encode('\\xe58d8ee4b8ba'::bytea,'hex'` 将字节数组 \xe58d8ee4b8ba 转化为 "e58d8ee4b8ba"。 **字符串转十六进制** * 使用 `convert_from` 函数将字符串转换为十六进制字符串,第一个参数为源编码(默认值为 `utf8`)。 * 例如,`convert_from(unhex('E58D8EE4B8BA'),'utf8'` 将十六进制字符串 "E58D8EE4B8BA" 转化为字符串 "华为"。 **注意事项** * `hex` 和 `unhex` 函数需要 820 版本或更高版本。 * `convert_from` 函数的第二个参数应根据源编码类型选择。 * 当源数据编码为 `utf8` 时,`encode` 函数将自动转换为十六进制字符串。

正文

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

 

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

与教你如何进行数仓字符串、二进制、十六进制互转相似的内容:

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

现网中遇到很多小伙伴不清楚字符串与进制之间的转换方法,其实在GaussDB(DWS)中,进制转换是非常方便的。

理论+实践,教你如何使用Nginx实现限流

摘要:Nginx作为一款高性能的Web代理和负载均衡服务器,往往会部署在一些互联网应用比较前置的位置。此时,我们就可以在Nginx上进行设置,对访问的IP地址和并发数进行相应的限制。 本文分享自华为云社区《【高并发】使用Nginx实现限流》,作者:冰 河。 Nginx作为一款高性能的Web代理和负载

教你如何用Vue3搭配Spring Framework

摘要:在本文中,我们将介绍如何使用Vue3和Spring Framework进行开发,并创建一个简单的TodoList应用程序。 本文分享自华为云社区《Vue3搭配Spring Framework开发【Vue3应用程序实战】》,作者:黎燃。 一、介绍 Vue3和Spring Framework都是现

杰哥教你面试之一百问系列:java多线程

java多线程是java面试中的高频问题,如何才能在面试中脱颖而出呢?熟读这里的一百个java多线程面试问题即可。 ### 1. **什么是线程?什么是进程?** **回答:** - 线程是操作系统能够进行调度的最小执行单位,它包含在进程中,共享进程的资源。 - 进程是一个正在执行中的程序,它包含了

教你如何搞定springboot集成kafka

本文分享自华为云社区《手拉手入门springboot+kafka》,作者:QGS。 安装kafka 启动Kafka本地环境需Java 8+以上 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 Kafka启动方式有Zookeeper和Kraft,两种方式只

教你如何轻松搞定云上打印管理

摘要:加快自主创新,满足数字化用户多场景文印需求。 本文分享自华为云社区《有了司印云打印,云上打印管理轻松搞定!》,作者:云商店 。 作为与职场和个人办公息息相关的工作场景,打印长期以来都是办公业务的核心应用和基本能力之一,即使在移动办公、云办公的时代仍然如此。 当前,市面上的打印机品牌型号差异大,

教你如何解决T+0的问题

摘要:T+0查询是指实时数据查询,数据查询统计时将涉及到最新产生的数据。 本文分享自华为云社区《大数据解决方案:解决T+0问题》,作者: 小虚竹 。 T+0问题 T+0查询是指实时数据查询,数据查询统计时将涉及到最新产生的数据。在数据量不大时,T+0很容易完成,直接基于生产数据库查询就可以了。但是,

教你如何通过CodeArts IDE插件调用API,高效合成语音

摘要:本实验基于华为云自研CodeArts IDE,指导用户通过使用华为云API,来实现一个文字合成语音的应用。 本文分享自华为云社区《通过CodeArts IDE插件调用API,高效合成语音!》,作者:华为云PaaS服务小智。 实验内容: CodeArts IDE定位华为云开发者桌面,是利用华为自

手把手教你如何在报表中查询数据

每周一个报表小技巧:如何在报表中引入数据筛选功能 >摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:[葡萄城官网](https://www.grapecity.com.cn/),葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 # 前言篇 在当今信息爆炸的时代,面对海量的

还在手动发早安吗?教你用java实现每日给女友微信发送早安

摘要:教你如何用java实现每日给女友微信发送早安等微信信息。 本文分享自华为云社区《java实现每日给女友微信发送早安等微信信息》,作者:穆雄雄 。 前言 据说这个功能最近在抖音上很火,我没有抖音,没有看到。 但是我在网上看了,相关案例确实很多,但是大家都是借助于了微信服务号,在我看来,效果很不佳