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