本文分享自華為雲社區《GaussDB(DWS)字元串、二進位、十六進位互轉》,作者:你是猴子請來的救兵嗎 。 概述 現網中遇到很多小伙伴不清楚字元串與進位之間的轉換方法,其實在GaussDB(DWS)中,進位轉換是非常方便的。這次就來對不同的場景一一進行解析,整理出來供大家翻閱參考。 字元串&二進位 ...
本文分享自華為雲社區《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)