如何将 Postgres bytea 转换为 base64 字符串

How to convert Postgres bytea to base64 string

我有一个 base64 图像,我正试图将其保存在 Postgres 数据库中(使用 Hasura)。该字段的类型为 bytea 我不确定如何将此数据保存到该字段。

我尝试将 data:image/png;base64,sisodjodo... 传递给该字段,它像这样保存:\x6956424f5277304b47676f414141414...

当我取回它时,它似乎并没有以与保存时相同的方式返回。

// Query the database and save resulting object
const user = {
  avatar: '\x6956424f5277304b47676f414141414...'
}
user.avatar = btoa(user.avatar);
console.log(user.avatar);
// Prints: XHg2OTU2NDI0ZjUyNzczMDRiNDc2NzZmNDE0MTQxNDE0Z...

Postgres bytea 字段必须以两种格式之一输入,最简单的格式是 hex。这种格式看起来像 \x[your byte string in hex]

因此,假设您有一个名为 things 的 table 和一个 byteafield,您可以使用字节字符串 010101 插入一个新行] 像这样:

mutation {
  insert_things_one(object: {
    field: "\x010101"
  }) {
    field
  }
}

结果将是:

{
  "data": {
    "insert_thing_one": {
      "field": "\x010101"
    }
  }
}

注意在 GraphQL 中你必须转义 \。您可以在 SQL 中验证它是否正确存储:

> select * from things;

field
\x010101

如果你想根据你的问题存储一个 base64 编码的字节字符串,你需要去掉前导 data:image/png;base64, 然后用你使用的任何语言将 base64 字符串编码为十六进制。在 JS 中:


PS。我不建议使用文本字段来存储 base64 编码的字符串。这将使您花费比必要更多的存储空间。根据我上面的回答,只是 re-encode 到十六进制。