问题描述
我将二进制数据存储在一个bytea字段中,但是在导入期间将其两次转换为十六进制。如何撤消双重编码?
我的二进制文件以字符“ 0”开头。以十六进制表示的是字符30。在psql中,我希望看到以\ x30开头的字符串,因为默认情况下它将以十六进制显示给我。但是我看到的是它以\ x783330开头,其中“ 78”代表“ x”的十六进制,“ 33”代表“ 3”,“ 30”代表“ 0”。所以说存储的字符串是:x30。
我可以通过将文本强制转换为字节编码来使情况变得更糟,例如encode(data,'hex'):: bytea,然后将其转换为\ x373833333330,但我找不到找到相反方法的方法。如果我尝试解码(data :: text,'hex'),它将抱怨''不是有效的十六进制字符串。如果我使用解码(3中的substring(data :: text),'hex'),我会得到原始字符串。
解决方法
您可能以错误的方式存储了bytea
。
如果您将十六进制字符串INSERT
bytea
解释为字符串,而不是十六进制数字,除非您以\x
开头。
请参见
SELECT 'DEADBEEF'::bytea,'\xDEADBEEF'::bytea;
bytea | bytea
--------------------+------------
\x4445414442454546 | \xdeadbeef
(1 row)
使用程序插入bytea
时,也有直接插入二进制数据的方法。如何完成取决于您使用的API。