Postgres在服务器上以十六进制存储字节数据吗



为了在PostgreSQL中处理字节值,我通常串行化到十六进制并从十六进制反序列化。这似乎是首选方式。然而,PostgreSQL服务器上实际存储的是什么?是十六进制,还是未固定的二进制?我关心的原因是,十六进制显然会占用两倍于未固定二进制的空间。当我说未固定二进制时,我指的是十六进制字符串";00〃;,即2个字节的数据仅仅是"1";0";,作为未混合二进制的1字节。

上下文是,我有一个Postgres数据库和一个Scylla数据库,它们以几乎完全相同的格式存储着完全相同的数据。然而,Postgres使用的总空间几乎是Scylla使用空间的两倍。对于"锡拉",我不会将二进制编码为十六进制。我只是通过网络发送原始二进制文件。我不希望这两个数据库使用完全相同的空间。但对于PostgreSQL来说,使用双倍的空间是相当大的开销,而且几乎精确的双倍确实让我怀疑数据是以十六进制存储的,而不是服务器上的实际二进制(因为十六进制使用的空间是实际二进制的两倍(。

bytea以二进制形式存储,而不是十六进制编码,这将非常浪费。十六进制表示法只是类型输出函数生成的默认文本表示法。

我不知道Scylla,所以我无法解释其中的区别,但PostgreSQL每行(23字节(有相当大的开销,每8kB块也有一些开销。

您在评论中说,您测量了数据库大小,其中包括所有元数据和索引。我建议你用pg_table_size来量表。

请注意,如果表行超过2000字节,PostgreSQL会自动压缩值。

最新更新