2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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,則使用舊的類別網路編號系統的假設進行計算,但它至少會足夠大以包含輸入中寫出的所有位元組。指定一個網路地址,該地址在指定的網路掩碼右側有設定為 1 的位元位是錯誤的。

表 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. inetcidr #

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。如今,這種約定已被廣泛忽略,並且只與過時的網路協議(如令牌環)相關。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 位應設定為一。函式 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)

提交更正

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