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

Igo*_*yev 15 postgresql bitmask sqldatatypes postgresql-9.0

我在那有确定某些国家(例如,几个布尔列的PostgreSQL数据库的表的工作published,visible等等).我想创建一个单独的状态列,它将以位掩码的形式存储所有这些值以及可能的新值.在这种情况下integer和之间有什么区别bit(n)吗?

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

Erw*_*ter 26

如果您只有几个变量,我会考虑保留单独的boolean列.

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

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

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

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

对于仅3位信息,单个boolean列通过3个字节获得,integer需要4个字节(可能是额外的对齐填充)和bit string6个字节(5 + 1).

对于32位信息,integer仍需要4个字节(+填充),a bit string占用9个字节(5 + 4),boolean列占用32个字节.

要进一步优化磁盘空间,您需要了解PostgreSQL的存储机制,尤其是数据对齐.更多相关答案.

关于如何转换类型 boolean,bit(n)integer的答案也可能有所帮助.