我是否在我的 Postgres 数据库中以正确的格式存储图片?

Did I store pictures in the correct format in my Postgres database?

提问人:Dennis 提问时间:11/14/2023 最后编辑:Dennis 更新时间:11/15/2023 访问量:50

问:

我有一个Postgres数据库,里面有一个单独的图片表。我已经将图片存储在数据库中,当我像这样列出它们时;

SELECT id,
   pg_typeof(image) || ': ' || encode(image::bytea, 'escape') AS image_representation
FROM picture_table;

我看到这个列表;

enter image description here

问题是,我是否以正确的方式存储图片?,我怀疑我将 base64 数据存储为二进制,因此占用了所需的更多空间。

这是最有效的方法吗?,它是Postgres中的“bytea”类型。

示例:如果我有一张 900 字节的二进制图片,如果它存储为 base64,那么存储为 base64 时将占用大约 2400 字节。我看到它存储为 base64。或者它只是查询后显示的方式。

PostgreSQL Base64 字节

评论

0赞 Zegarek 11/14/2023
如果你问的是数据类型,是正确的。如果你问的是图像存储的空间效率,这是一个关于压缩和文件格式的问题 - 还不错,但有更新的,可以说是更好的标准,比如 和 ,其中还有更多的东西需要调整。byteapngavifwebpheic
0赞 Zegarek 11/14/2023
此外,与所有可能被 TOAST 处理的数据一样,调整存储设置,如果您确实让它压缩,请在 PostgreSQL 14+ 中检查您的压缩实用程序
0赞 Dennis 11/14/2023
bytea 是正确的格式,但看看图像表示列,这是存储它的正确方法。我对压缩格式了解很多,但这不是我要问的。
0赞 Bohemian 11/14/2023
Bytea 是小型二进制数据的最佳数据类型。我不明白你在问什么——看起来你实际上没有问题。
0赞 Zegarek 11/14/2023
感谢您的澄清。在我看来,如果您的目标是在网络上提供此服务,那么这绝对是正确的,并且所有图像都已经可以直接从数据库中直接进行 HTML 内联,这对您的服务器来说很方便。如果你想把它们保留在那里“原始”,你一定要去掉 base64 层,并且可能还有一个我期望在上面的额外 URL 转义:普通的 base64 将被 r-padded , URL 转义它将显示 .=%3D

答:

0赞 jjanes 11/15/2023 #1

您将文本写入数据库的 bytea 列中。保存为类型文本的文本与保存为 bytea 类型的文本占用的磁盘空间量相同。如果你愿意,你可以这样做,但由于使用 bytea 很尴尬,你可能应该避免不必要的事情。

由于它已经编码为文本,因此您可以将其保存为文本。“data:image/png;base64“是您(或您的客户)保存到数据库中的文字字符(以及其他字符),它不是PostgreSQL提供给您的。

示例:如果我有一张 900 字节的二进制图片,如果它存储为 base64,则存储为 base64 时将占用大约 2400 字节

不,编码为 base64 的 900 字节只需要 1200 多一点,而不是 2400。即使将其编码为十六进制也不会占用 2400 个字节。这只是查看原始大小,没有考虑可能发生的任何压缩。如果要使压缩生效,则应查看数据占用的实际大小,而不是试图从理论上解决它。

我看到它存储为 base64。或者它只是查询后显示的方式。

它存储为 base64。但这不是PostgreSQL所做的,它只是你的客户端发送数据保存的方式。你告诉它使用转义格式,但只看你显示的图像,实际上没有进行转义,因为没有什么需要转义的。