淺探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”可以表示任意長度的位串。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章