Các sourcecode cho kiểu dữ liệu IP hiển thị này:
typedef struct
{
unsigned char family; /* PGSQL_AF_INET or PGSQL_AF_INET6 */
unsigned char bits; /* number of bits in netmask */
unsigned char ipaddr[16]; /* up to 128 bits of address */
} inet_struct;
Điều này có nghĩa, mà thêm vào các dữ liệu "thô" trong ipaddr
(4 byte cho IP4, 16 byte cho IP6) có một byte cho netmask và và một byte cho gia đình địa chỉ (về cơ bản là một switch cho IP4/IP6).
Bên cạnh đó có các varlena
overhead được đề cập trong cùng một tập tin:
/*
* Both INET and CIDR addresses are represented within Postgres as varlena
* objects, ie, there is a varlena header in front of the struct type
* depicted above. This struct depicts what we actually have in memory
* in "uncompressed" cases. Note that since the maximum data size is only
* 18 bytes, INET/CIDR will invariably be stored into tuples using the
* 1-byte-header varlena format. However, we have to be prepared to cope
* with the 4-byte-header format too, because various code may helpfully
* try to "decompress" 1-byte-header datums.
*/
typedef struct
{
char vl_len_[4]; /* Do not touch this field directly! */
inet_struct inet_data;
} inet;
Vì vậy, các phương trình cho IP4 là thế này:
1 byte varlena
1 byte address family
1 byte netmask
4 raw bytes
===========
7 byte total
Đối với IP6 cùng một công thức cung cấp cho bạn 19 byte.
EDIT Phiên bản cũ hơn của PostgreSQL chỉ có biểu diễn varlena 4 byte. Do đó bạn có thể thêm 3 byte cho mỗi loại (IP4: 10, IP6: 22). Ngày đầu đó có một padding lên đến 4 byte tiếp theo biên giới. Điều này cung cấp cho bạn 2 byte cho mỗi loại thêm tối đa 12 hoặc 24 byte.
This mail làm sáng tỏ sự phát triển của phiên bản ngắn hơn.
Nguồn
2012-07-18 19:18:57
Cần ít nhất +1 byte cho các bit mặt nạ mạng ví dụ: "10.1.0.0/8" hợp lệ cho mặt nạ 10.1.0.0 255.0.0.0 –