浅探PostgreSQL中的bit类型

Bit,即比特,是二进制数字中的位PostgreSQL 中提供了用于表示比特串数据类型bit。在PostgreSQL 中,bit 类型常见用法是bit(n),这里n表示bit串的长度。同时,也有不带(n)bit和带双引号的”bit”。它们各自的含义是什么呢?又有什么联系和区别?简言之,不带“(n)”bit表示bit(1),而带双引号的”bit”表示任意长度的位串。

 

我们通过下面的SQL语句创建一张表:

create table tb_bit

(

   bit_col bit,

   quoted_bit_col "bit",

   bit1_col bit(1)

);

 

可以看到表 tb_bit 共有3列,他们的类型依次是不带(n)bit,带引号且未指定长度的bit“”bit(1)char(2)bit(1)表示长度为1的位串,而另外两种类型是什么含义呢?

 

我们执行下列查询,从pg_attribute中查看这几列的属性:

 

select attrelid,attname,atttypid,attlen,atttypmod from pg_attribute where attrelid = ' tb_bit '::regclass::oid and attnum > 0

 

结果是:

attrelid |    attname     | atttypid | attlen | atttypmod

----------+----------------+----------+--------+-----------

   392727 | bit_col        |     1560 |     -1 |         1

   392727 | quoted_bit_col |     1560 |     -1 |        -1

   392727 | bit1_col       |     1560 |     -1 |         1

(3 行记录)

 

可以看出 bit_col 的类型和长度同bit1_col的相同,因此可以断定,不带(n)bit默认表示bit(1)quoted_bit_col atttypmod=-1

PostgreSQL 官方文档对字段atttypmod的描述是:

对于一个固定尺寸的类型,typlen是该类型内部表示的字节数。对于一个变长类型,typlen为负值。-1表示一个"varlena"类型(具有长度字),-2表示一个以空值结尾的C字符串。

因此,带双引号的“bit”类型是变长的。

我们可以通过下面的实验验证。

执行如下查询:

select '11'::bit;

查询结果:

bit

-----

 1

(1 行记录)

 

再执行查询:

 select '11'::"bit";

查询结果:

 bit

-----

 11

(1 行记录)

 

执行查询:

select '111'::"bit";

查询结果:

 bit

-----

 111

(1 行记录)

 

可以看出,未指定长度且不带引号的bit类型默认为长度为1的位串,而带双引号的”bit”可以表示任意长度的位串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值