支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

8.9. 網路位址類型 #

PostgreSQL 提供了資料類型來儲存 IPv4、IPv6 和 MAC 位址,如表 8.21 所示。 最好使用這些類型而不是純文字類型來儲存網路位址,因為這些類型提供輸入錯誤檢查以及專用的運算子和函數 (請參閱第 9.12 節)。

表 8.21. 網路位址類型

名稱 儲存大小 描述
cidr 7 或 19 位元組 IPv4 和 IPv6 網路
inet 7 或 19 位元組 IPv4 和 IPv6 主機與網路
macaddr 6 位元組 MAC 位址
macaddr8 8 位元組 MAC 位址 (EUI-64 格式)

在排序 inetcidr 資料類型時,IPv4 位址永遠會排序在 IPv6 位址之前,包括封裝或對應到 IPv6 位址的 IPv4 位址,例如 ::10.2.3.4 或 ::ffff:10.4.3.2。

8.9.1. inet #

inet 類型保存 IPv4 或 IPv6 主機位址,並可選擇其子網路,全部都在一個欄位中。 子網路由主機位址中存在的網路位址位元數 (「網路遮罩」) 表示。 如果網路遮罩是 32 且位址是 IPv4,則該值不表示子網路,僅表示單一主機。 在 IPv6 中,位址長度為 128 位元,因此 128 位元指定唯一的主機位址。 請注意,如果您只想接受網路,您應該使用 cidr 類型,而不是 inet

此類型的輸入格式為 address/y,其中 address 是 IPv4 或 IPv6 位址,而 y 是網路遮罩中的位元數。 如果省略 /y 部分,則 IPv4 的網路遮罩預設為 32,IPv6 則預設為 128,因此該值僅代表單一主機。 在顯示時,如果網路遮罩指定單一主機,則會隱藏 /y 部分。

8.9.2. cidr #

cidr 類型保存 IPv4 或 IPv6 網路規範。 輸入和輸出格式遵循無類別網域間路由 (Classless Internet Domain Routing) 慣例。 指定網路的格式為 address/y,其中 address 是以 IPv4 或 IPv6 位址表示的網路最低位址,而 y 是網路遮罩中的位元數。 如果省略 y,則會使用舊式類別網路編號系統的假設來計算它,但它至少要大到足以包含輸入中寫入的所有八位元組。 指定網路位址,該網路位址的位元設定在指定網路遮罩的右側是一個錯誤。

表 8.22 顯示了一些範例。

表 8.22. cidr 類型輸入範例

cidr 輸入 cidr 輸出 abbrev(cidr)
192.168.100.128/25 192.168.100.128/25 192.168.100.128/25
192.168/24 192.168.0.0/24 192.168.0/24
192.168/25 192.168.0.0/25 192.168.0.0/25
192.168.1 192.168.1.0/24 192.168.1/24
192.168 192.168.0.0/24 192.168.0/24
128.1 128.1.0.0/16 128.1/16
128 128.0.0.0/16 128.0/16
128.1.2 128.1.2.0/24 128.1.2/24
10.1.2 10.1.2.0/24 10.1.2/24
10.1 10.1.0.0/16 10.1/16
10 10.0.0.0/8 10/8
10.1.2.3/32 10.1.2.3/32 10.1.2.3/32
2001:4f8:3:ba::/64 2001:4f8:3:ba::/64 2001:4f8:3:ba/64
2001:4f8:3:ba:​2e0:81ff:fe22:d1f1/128 2001:4f8:3:ba:​2e0:81ff:fe22:d1f1/128 2001:4f8:3:ba:​2e0:81ff:fe22:d1f1/128
::ffff:1.2.3.0/120 ::ffff:1.2.3.0/120 ::ffff:1.2.3/120
::ffff:1.2.3.0/128 ::ffff:1.2.3.0/128 ::ffff:1.2.3.0/128

8.9.3. inet vs. cidr #

inetcidr 資料類型之間的主要區別在於 inet 接受網路遮罩右側具有非零位元的值,而 cidr 不接受。 例如,192.168.0.1/24 對於 inet 有效,但對於 cidr 無效。

提示

如果您不喜歡 inetcidr 值的輸出格式,請嘗試使用 hosttextabbrev 函數。

8.9.4. macaddr #

macaddr 類型用於儲存 MAC 位址,例如乙太網路卡硬體位址 (儘管 MAC 位址也用於其他用途)。 接受以下格式的輸入:

'08:00:2b:01:02:03'
'08-00-2b-01-02-03'
'08002b:010203'
'08002b-010203'
'0800.2b01.0203'
'0800-2b01-0203'
'08002b010203'

這些範例都指定了相同的位址。 數字 af 接受大寫和小寫。 輸出始終採用顯示的第一種格式。

IEEE 標準 802-2001 指定了顯示的第二種格式(帶連字符)作為 MAC 位址的規範格式,並指定第一種格式(帶冒號)用於位元反轉的 MSB 優先表示法,因此 08-00-2b-01-02-03 = 10:00:D4:80:40:C0。 如今,這種約定已被廣泛忽略,它僅適用於過時的網路協定(例如 Token Ring)。 PostgreSQL 不提供位元反轉;所有接受的格式都使用規範的 LSB 順序。

其餘五種輸入格式不是任何標準的一部分。

8.9.5. macaddr8 #

macaddr8 類型以 EUI-64 格式儲存 MAC 位址,例如乙太網路卡硬體位址 (儘管 MAC 位址也用於其他用途)。 此類型可以接受 6 位元組和 8 位元組長度的 MAC 位址,並將它們以 8 位元組長度格式儲存。 以 6 位元組格式給定的 MAC 位址將以 8 位元組長度格式儲存,其中第 4 個和第 5 個位元組分別設定為 FF 和 FE。 請注意,IPv6 使用修改後的 EUI-64 格式,其中從 EUI-48 轉換後,第 7 位元應設定為 1。 提供了 macaddr8_set7bit 函數來進行此變更。 一般來說,任何由成對的十六進位數字(在位元組邊界上)組成的輸入,可以選擇性地始終如一地由 ':''-''.' 分隔,都是可接受的。 十六進位數字的數量必須是 16 (8 個位元組) 或 12 (6 個位元組)。 會忽略開頭和結尾的空白字元。 以下是可接受的輸入格式的範例:

'08:00:2b:01:02:03:04:05'
'08-00-2b-01-02-03-04-05'
'08002b:0102030405'
'08002b-0102030405'
'0800.2b01.0203.0405'
'0800-2b01-0203-0405'
'08002b01:02030405'
'08002b0102030405'

這些範例都指定了相同的位址。 數字 af 接受大寫和小寫。 輸出始終採用顯示的第一種格式。

上面顯示的最後六種輸入格式不是任何標準的一部分。

若要將 EUI-48 格式的傳統 48 位元 MAC 位址轉換為修改後的 EUI-64 格式,以便包含為 IPv6 位址的主機部分,請使用 macaddr8_set7bit,如下所示:

SELECT macaddr8_set7bit('08:00:2b:01:02:03');

    macaddr8_set7bit
-------------------------
 0a:00:2b:ff:fe:01:02:03
(1 row)

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用此表單回報文件問題。