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
,則使用舊的類別網路編號系統的假設進行計算,但它至少會足夠大以包含輸入中寫出的所有位元組。指定一個網路地址,該地址在指定的網路掩碼右側有設定為 1 的位元位是錯誤的。
表 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
與 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。如今,這種約定已被廣泛忽略,並且只與過時的網路協議(如令牌環)相關。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 位應設定為一。函式 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)
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表格 來報告文件問題。