【问题标题】:Double encoded bytea in PostgreSQLPostgreSQL中的双重编码字节
【发布时间】:2020-12-13 13:09:42
【问题描述】:

我将二进制数据存储在 bytea 字段中,但在导入期间已将其两次转换为十六进制。如何撤消双重编码?

我的二进制文件以字符“0”开头。在十六进制中是字符 30。在 psql 中,我希望看到以 \x30 开头的字符串,因为默认情况下它会以十六进制显示给我。但我看到的是它以 \x783330 开头,其中“78”是十六进制的“x”,“33”是“3”,“30”是“0”。所以它说存储的字符串是:x30。

我可以通过将文本转换为 bytea 来使情况变得更糟,例如 encode(data, 'hex')::bytea,然后将其转换为 \x373833333330,但我找不到相反的方法。如果我尝试 decode(data::text, 'hex') 它会抱怨 '' 不是有效的十六进制字符串。如果我使用 decode(substring(data::text) from 3), 'hex'),我会取回原来的字符串。

【问题讨论】:

    标签: postgresql bytea


    【解决方案1】:

    您可能以错误的方式存储了bytea

    如果您将一个十六进制字符串INSERT 转换为一个bytea,它将被解释为一个字符串而不是十六进制数字,除非您在它前面加上\x

    SELECT 'DEADBEEF'::bytea, '\xDEADBEEF'::bytea;
    
           bytea        |   bytea    
    --------------------+------------
     \x4445414442454546 | \xdeadbeef
    (1 row)
    

    使用程序插入bytea时,也有直接插入二进制数据的方法;具体如何完成取决于您使用的 API。

    【讨论】:

    • 是的,我以错误的方式存储了一些数据。当使用 COPY 将其导入到 bytea[] 中时,我已将其作为 \\x30 发送,而不是作为 \\\\x30 发送。但只有一小部分数据是无效的。我希望仅使用 SQL 命令来解决此问题,而不是导出数据并再次导入。
    猜你喜欢
    • 2015-06-26
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 2023-03-09
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多