>在this doc page的底部有一句话:
… plus 5 or 8 bytes overhead depending on the length of the string
>如何通过Npgsql,ODBC等驱动程序在其他语言(如PHP,Java,C#,C等)中处理位串.
对于问题#1,使用smallint或bigint将提高存储效率,并且可能会提供性能提升,因为所有地方都支持整数.大多数编程语言都可以轻松处理整数上的位操作.如果是这种情况,引入位串数据类型的重点是什么?仅适用于需要大量位掩码的情况吗?比特字段索引可能吗?我对如何在Postgresql中完成位字段索引感到好奇.
对于#2,我很困惑,不仅仅是好奇.例如,如果我将星期位掩码存储在位(7)字段中,一天一位,最低位代表星期一,该怎么办?然后我在PHP和C中查询值.我会得到什么?文档说我会有一些字符串,但是有点字符串不能直接使用 – 就像整数一样.那么在这种情况下,我应该放弃比特字段吗?
任何人都可以详细说明为什么以及何时应该使用位或位变化?
boolean
列.
>索引很容易.特别是,indexes on expressions很容易.
>查询和部分索引的条件易于编写和读取且有意义.
>布尔列占用1个字节.对于少数变量,这占用的空间最小.
>与其他选项不同,如果您需要,布尔列允许单个位的NULL值.如果不这样,您始终可以定义NOT NULL列.
优化存储
如果您有超过手动满变量但小于33,则integer
列可能最适合您. (或者最多可以包含64个变量.)
>在磁盘上占用4个字节.
>精确匹配(=运算符)的快速索引.
>处理单个值可能比使用位串或布尔值更慢/更不方便.
有了更多的变量,或者你想要大量操作这些值,或者如果你没有巨大的表和磁盘空间/ RAM没有问题,或者如果你不确定要选择什么,我会考虑bit(n)
or bit varying(n)
.
>占用至少5个字节(或非常长的字符串为8)加上每组8位(向上舍入)的1个字节.
>您可以直接使用bit string functions and operators.
例子
对于仅3位信息,单个布尔列通过3个字节获得,一个整数需要4个字节,位串为6个字节(5 1).
对于32位信息,一个整数仍需要4个字节,一个位字符串占用9个字节(5 4),布尔列占用32个字节.
进一步阅读
> Is there any difference between integer and bit(n) data types for a bitmask?
> Calculating and saving space in PostgreSQL
> Can I convert a bunch of boolean columns to a single bitmap in PostgreSQL?