【问题标题】:How to convert Postgres bytea to base64 string如何将 Postgres bytea 转换为 base64 字符串
【发布时间】:2021-01-29 08:04:01
【问题描述】:

我有一个 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...

【问题讨论】:

  • 无论btoa() 是什么,它都不会将您的'\x6956424f5277304b47676f41414141' 视为二进制文件。而是将其视为\x6956424f5277304b47676f41414141 的字符串表示形式。我不使用 javascript,因为它是魔鬼的母语,但我能够使用 select encode('\\x6956424f5277304b47676f41414141', 'base64'); 以一种不黑暗的语言复制您的输出。
  • 对 base64 编码图像使用 text,而不是 bytea
  • @MikeOrganek btoa() 从二进制字符串(即字符串中的每个字符都被视为二进制数据字节的字符串对象)创建一个 Base64 编码的 ASCII 字符串。
  • @LaurenzAlbe 我不确定我可以我不是数据库管理员,所以我没有能力更改它。
  • 您看到的表示是存储在列中的二进制数据的十六进制字符串表示。无论您使用什么从数据库中检索它,都将其视为字符串而不是字节数组。能否包含用于查询 PostgreSQL 的代码?

标签: javascript postgresql base64 hasura bytea


【解决方案1】:

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

因此,假设您有一个名为 things 的表,其中有一个 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中:Decode Base64 to Hexadecimal string with javascript


附言。我不建议使用文本字段来存储 base64 编码的字符串。这将花费您比必要更多的存储空间。根据我上面的回答,只需重新编码为十六进制即可。

【讨论】:

  • 好的,太好了!它现在正在保存,但是如何在使用 Hasura 进行查询时将其转换回 base64?
  • NVM: btoa(user.avatar.replace('\\x', '').match(/\w{2}/g).map(a => String.fromCharCode(parseInt(a, 16))).join(""))
  • 是的,没错! ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 2015-12-20
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多