PostgreSQL中bytea的双重编码

问题描述

我将二进制数据存储在一个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。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...