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

Javascript 如何将Postgres bytea转换为base64字符串,javascript,postgresql,base64,hasura,bytea,Javascript,Postgresql,Base64,Hasura,Bytea,我有一个base64图像,我正试图保存在Postgres数据库中(使用Hasura)。该字段的类型为bytea我不确定如何将此数据保存到该字段 我试着传递数据:image/png;base64,sisodjodo…保存到该字段,并按如下方式保存:\x6956424f5277304b47676f414141414… 当我把它拿回来的时候,它似乎并没有以保存它的方式回来 //查询数据库并保存结果对象 常量用户={ 头像:'\X695624F527704B47676F41414141414…' } u

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

我试着传递
数据:image/png;base64,sisodjodo…
保存到该字段,并按如下方式保存:
\x6956424f5277304b47676f414141414…

当我把它拿回来的时候,它似乎并没有以保存它的方式回来

//查询数据库并保存结果对象
常量用户={
头像:'\X695624F527704B47676F41414141414…'
}
user.avatar=btoa(user.avatar);
console.log(user.avatar);
//印刷品:XHG2OTU2NDI0ZJUYNZMZMDRINDC2NZZMNDE0MTQXNDE0Z。。。

Postgres
bytea
字段必须以两种格式之一输入,最简单的格式是。此格式类似于
\x[您的十六进制字节字符串]

因此,假设您有一个名为
things
的表,其中包含
bytea
字段
,您可以插入一个包含字节字符串
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中:



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

无论
btoa()
是什么,它都不会将您的
'\x6956424f5277304b47676f414141'视为二进制。相反,它将其视为
\x6956424f5277304b47676f41414141的字符串表示形式。我不使用javascript,因为它是魔鬼的母语,但我可以使用
select encode('\\x6956424f5277304b47676f41414141','base64')复制您的输出使用非黑暗语言。对base64编码图像使用
text
,而不是
bytea
。@MikeOrganek
btoa()
从二进制字符串(即字符串对象,其中字符串中的每个字符都被视为二进制数据的字节)创建base64编码的ASCII字符串@LaurenzAlbe我不确定我能不能我不是数据库管理员,所以我没有能力更改它。您看到的表示形式是存储在列中的二进制数据的十六进制字符串表示形式。无论您使用什么方法从数据库中检索它,都将其视为字符串而不是字节数组。你能包括你用来查询PostgreSQL的代码吗?好的,太好了!它现在正在保存,但如何在使用Hasura进行查询时将其转换回base64?NVM:
btoa(user.avatar.replace('\\x',''.match(/\w{2}/g).map(a=>String.fromCharCode(parseInt(a,16)).join(“”)
Yep,没错!