我应该使用PostgreSQL位字符串吗?

前端之家收集整理的这篇文章主要介绍了我应该使用PostgreSQL位字符串吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我最近一直在学习位串数据类型,我很好奇:

>在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?

原文链接:https://www.f2er.com/postgresql/192332.html

猜你在找的Postgre SQL相关文章