在 postgres 列中仅存储 -1 0 和 1 的正确数据类型是什么?

Pir*_*App 15 postgresql performance database-design datatypes

  • 我只想在一列中存储 3 个状态(如果是 2,我会使用布尔值)
  • 我考虑过使用 ENUM('up', 'down', 'none') 但似乎 ENUM 占用了一些空间
  • 有没有更好的方法在 PostgresQL 列中只存储 -1 0 和 1?

Lau*_*lbe 25

如果要节省空间,可以使用"char"数据类型。它存储单个字节。

你可以投射integertext"char"

SELECT 'u'::"char", 'd'::"char", 'n'::"char";

 char | char | char 
------+------+------
 u    | d    | n
(1 row)
Run Code Online (Sandbox Code Playgroud)

枚举使用 4 个字节,因为它在内部存储为real.

为了节省空间,您必须考虑对齐。这些值始终根据类型对齐进行对齐。例如,abigint总是必须从一个可以被 8 整除的地址开始。

现在,如果您的表被定义为

CREATE TABLE (
   smallflag "char",
   largenum  bigint
);
Run Code Online (Sandbox Code Playgroud)

列之间将有 7 个填充字节,这将呈现"char"模拟中的所有空间收益。

因此,请小心放置表格列。

  • 绝对真实。通常为存储空间和便携性而精打细算并不能很好地结合在一起。 (6认同)
  • 我喜欢 `"char"`,但需要注意的是,它在手册中仍然被标记为“内部”类型,而不是在 SQL 标准中,也不能移植到其他 RDBMS。 (5认同)

小智 15

有点麻烦,但是如果您使列可以为空,您仍然可以使用 bool,将空值作为第三个值。

不过,布尔值在 Postgres 中仍然使用 1 个字节。

  • 使用 null 作为第三个值的一个大问题是 null 的连接语义与非 null 值不同。 (2认同)