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 格式) |
在排序 inet
或 cidr
資料類型時,IPv4 位址永遠會排序在 IPv6 位址之前,包括封裝或對應到 IPv6 位址的 IPv4 位址,例如 ::10.2.3.4 或 ::ffff:10.4.3.2。
inet
#inet
類型保存 IPv4 或 IPv6 主機位址,並可選擇其子網路,全部都在一個欄位中。 子網路由主機位址中存在的網路位址位元數 (「網路遮罩」) 表示。 如果網路遮罩是 32 且位址是 IPv4,則該值不表示子網路,僅表示單一主機。 在 IPv6 中,位址長度為 128 位元,因此 128 位元指定唯一的主機位址。 請注意,如果您只想接受網路,您應該使用 cidr
類型,而不是 inet
。
此類型的輸入格式為 address/y
,其中 address
是 IPv4 或 IPv6 位址,而 y
是網路遮罩中的位元數。 如果省略 /y
部分,則 IPv4 的網路遮罩預設為 32,IPv6 則預設為 128,因此該值僅代表單一主機。 在顯示時,如果網路遮罩指定單一主機,則會隱藏 /y
部分。
cidr
#cidr
類型保存 IPv4 或 IPv6 網路規範。 輸入和輸出格式遵循無類別網域間路由 (Classless Internet Domain Routing) 慣例。 指定網路的格式為 address/y
,其中 address
是以 IPv4 或 IPv6 位址表示的網路最低位址,而 y
是網路遮罩中的位元數。 如果省略 y
,則會使用舊式類別網路編號系統的假設來計算它,但它至少要大到足以包含輸入中寫入的所有八位元組。 指定網路位址,該網路位址的位元設定在指定網路遮罩的右側是一個錯誤。
表 8.22 顯示了一些範例。
表 8.22. cidr
類型輸入範例
cidr 輸入 |
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 |
inet
vs. cidr
#inet
和 cidr
資料類型之間的主要區別在於 inet
接受網路遮罩右側具有非零位元的值,而 cidr
不接受。 例如,192.168.0.1/24
對於 inet
有效,但對於 cidr
無效。
如果您不喜歡 inet
或 cidr
值的輸出格式,請嘗試使用 host
、text
和 abbrev
函數。
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' |
這些範例都指定了相同的位址。 數字 a
到 f
接受大寫和小寫。 輸出始終採用顯示的第一種格式。
IEEE 標準 802-2001 指定了顯示的第二種格式(帶連字符)作為 MAC 位址的規範格式,並指定第一種格式(帶冒號)用於位元反轉的 MSB 優先表示法,因此 08-00-2b-01-02-03 = 10:00:D4:80:40:C0。 如今,這種約定已被廣泛忽略,它僅適用於過時的網路協定(例如 Token Ring)。 PostgreSQL 不提供位元反轉;所有接受的格式都使用規範的 LSB 順序。
其餘五種輸入格式不是任何標準的一部分。
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' |
這些範例都指定了相同的位址。 數字 a
到 f
接受大寫和小寫。 輸出始終採用顯示的第一種格式。
上面顯示的最後六種輸入格式不是任何標準的一部分。
若要將 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)
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用此表單回報文件問題。