位掩码的整数和位(n)数据类型之间有什么区别吗?

时间:2012-04-03 10:32:46

标签: postgresql sqldatatypes bitmask postgresql-9.0

我正在使用PostgreSQL数据库中的一个表,该数据库有几个布尔列,用于确定某些状态(例如publishedvisible等)。我想创建一个单独的状态列,它将以位掩码的形式存储所有这些值以及可能的新值。在这种情况下,integerbit(n)之间是否存在差异?

这将是一个相当大的表,因为它存储用户通过Web界面创建的对象。所以我想我必须为这个列使用(部分)索引。

2 个答案:

答案 0 :(得分:24)

如果您只有一些变量,我会考虑保留单独的boolean列。

  • 索引很容易。特别是indexes on expressionspartial indexes
  • 查询条件易于编写和阅读且有意义。
  • 布尔列占用1个字节(无对齐填充)。对于少数变量,这占据的空间最小。
  • 与其他选项boolean不同,如果您需要,则列允许单个位的 NULL 值。如果不这样做,您可以随时定义列NOT NULL

如果您有超过手动完整变量但不超过32 ,则integer可能最佳。 (或最多64个变量的bigint。)

  • 占用磁盘上的4个字节(可能需要对齐填充,具体取决于前面的列)。
  • 非常快速的完全匹配索引(=运算符)。
  • 处理单个值可能比使用varbitboolean更慢/更不方便。

有更多变量,或者你想要大量操作这些值,或者如果你没有巨大的表或磁盘空间/ RAM不是问题,或者如果你不确定要选择什么,我会考虑bit(n) or bit varying(n) (short: varbit(n)

对于仅 3位的信息,单个boolean列得到3个字节,integer需要4个字节(可能是额外的对齐填充)和{{1 6个字节(5 + 1)。

对于 32位的信息,bit string仍然需要4个字节(+填充),integer占用9个字节(5 + 4)和{ {1}}列占用32个字节。

要进一步优化磁盘空间,您需要了解PostgreSQL的存储机制,尤其是数据对齐。 More in this related answer

This answer关于如何转换类型 布尔位(n)整数也可能有所帮助。

答案 1 :(得分:1)

您可以将bit string functions直接应用于位字符串,而无需从整数转换。