IP 函数对 IP、网络和子网地址执行转换、计算和处理操作。
1 - INET_ATON
将包含 IPv4 网络地址的点分表示的字符串转换为 INTEGER。剪裁字符串中周边的任何空格。如果字符串为 NULL 或包含除点分 IPv4 地址以外的任何内容,则此函数返回 NULL。
行为类型
不可变语法
INET_ATON ( expression )
参数
expression
- 要转换的字符串。
示例
=> SELECT INET_ATON('209.207.224.40');
inet_aton
------------
3520061480
(1 row)
=> SELECT INET_ATON('1.2.3.4');
inet_aton
-----------
16909060
(1 row)
=> SELECT TO_HEX(INET_ATON('1.2.3.4'));
to_hex
---------
1020304
(1 row)
另请参阅
2 - INET_NTOA
将 INTEGER 值转换为 IPv4 网络地址的 VARCHAR 点分表示。如果整数值为 NULL、负数或大于 232 (4294967295),则 INET_NTOA 返回 NULL。
行为类型
不可变语法
INET_NTOA ( expression )
参数
- 表达式
- 要转换的整数网络地址。
示例
=> SELECT INET_NTOA(16909060);
inet_ntoa
-----------
1.2.3.4
(1 row)
=> SELECT INET_NTOA(03021962);
inet_ntoa
-------------
0.46.28.138
(1 row)
另请参阅
3 - V6_ATON
将包含以冒号分隔的 IPv6 网络地址的字符串转换为 VARBINARY 字符串。IPv6 地址周围的所有空格都会被剪裁。如果输入值为 NULL 或无法解析为 IPv6 地址,则此函数返回 NULL。此函数依赖 Linux 函数 inet_pton。
行为类型
不可变语法
V6_ATON ( expression )
参数
- 表达式
- (VARCHAR) 包含要转换的 IPv6 地址的字符串。
示例
=> SELECT V6_ATON('2001:DB8::8:800:200C:417A');
v6_aton
------------------------------------------------------
\001\015\270\000\000\000\000\000\010\010\000 \014Az
(1 row)
=> SELECT V6_ATON('1.2.3.4');
v6_aton
------------------------------------------------------------------
\000\000\000\000\000\000\000\000\000\000\377\377\001\002\003\004
(1 row)
SELECT TO_HEX(V6_ATON('2001:DB8::8:800:200C:417A'));
to_hex
----------------------------------
20010db80000000000080800200c417a
(1 row)
=> SELECT V6_ATON('::1.2.3.4');
v6_aton
------------------------------------------------------------------
\000\000\000\000\000\000\000\000\000\000\000\000\001\002\003\004
(1 row)
另请参阅
4 - V6_NTOA
将表示为变长二进制的 IPv6 地址转换为字符串。
行为类型
不可变语法
V6_NTOA ( expression )
参数
expression
- (
VARBINARY
) 是要转换的二进制字符串。
注意
下述语法将表示为 VARBINARY
B 的 IPv6 地址转换为字符串 A。
V6_NTOA
在 B 右侧填充 0 至 16 字节(若必要),并调用 Linux 函数 inet_ntop。
=> V6_NTOA(VARBINARY B) -> VARCHAR A
如果 B 为 NULL 或超过 16 个字节,则结果为 NULL。
Vertica 自动将格式 "::ffff:1.2.3.4" 转换为 "1.2.3.4"。
示例
=> SELECT V6_NTOA(' \001\015\270\000\000\000\000\000\010\010\000 \014Az');
v6_ntoa
---------------------------
2001:db8::8:800:200c:417a
(1 row)
=> SELECT V6_NTOA(V6_ATON('1.2.3.4'));
v6_ntoa
---------
1.2.3.4
(1 row)
=> SELECT V6_NTOA(V6_ATON('::1.2.3.4'));
v6_ntoa
-----------
::1.2.3.4
(1 row)
另请参阅
5 - V6_SUBNETA
从二进制或字母数字 IPv6 地址返回一个包含 CIDR(无类别域间路由)格式的子网地址的 VARCHAR。如果任一参数为 NULL、地址无法解析为 IPv6 地址或子网值超出 0 到 128 的范围,则返回 NULL。
行为类型
不可变语法
V6_SUBNETA ( address, subnet)
参数
- address
- 包含 IPv6 地址的 VARBINARY 或 VARCHAR。
- subnet
- 子网的大小(以位为单位),为 INTEGER。此值必须大于零且小于或等于 128。
示例
=> SELECT V6_SUBNETA(V6_ATON('2001:db8::8:800:200c:417a'), 28);
v6_subneta
---------------
2001:db0::/28
(1 row)
另请参阅
6 - V6_SUBNETN
从变长二进制或字母数字 IPv6 地址计算无类别域间路由 (CIDR) 格式的子网地址。
行为类型
不可变语法
V6_SUBNETN ( address, subnet-size)
参数
- address
- IPv6 地址为 VARBINARY 或 VARCHAR。传入格式决定输出的日期类型。如果传入 VARBINARY 地址,则 V6_SUBNETN 返回 VARBINARY 值。如果传入一个 VARCHAR 值,则返回 VARCHAR。
- subnet‑size
- 子网的大小为 INTEGER。
注意
下述语法屏蔽 BINARY IPv6 地址 B
,使得 S
最左侧的 N 位形成子网地址,而剩余最右侧的位被清除。
V6_SUBNETN
在 B
右侧填充 0 至 16 字节 (若必要)并屏蔽 B
,保留其 N 位子网前缀。
=> V6_SUBNETN(VARBINARY B, INT8 N) -> VARBINARY(16) S
若 B
是 NULL 或长于 16 字节,或者 N
不在 0 到 128 之间(包含),则结果为 NULL。
S = [B]/N
用无类别域间路由 符号(CIDR 符号)表示。
下述语法屏蔽字母数字 IPv6 地址 A
,使得最左侧的 N
位形成子网地址,而剩余最右侧的位被清除。
=> V6_SUBNETN(VARCHAR A, INT8 N) -> V6_SUBNETN(V6_ATON(A), N) -> VARBINARY(16) S
示例
这个示例在使用 V6_ATON 将 VARCHAR 字符串转换为 VARBINARY 之后返回 VARBINARY:
=> SELECT V6_SUBNETN(V6_ATON('2001:db8::8:800:200c:417a'), 28);
v6_subnetn
---------------------------------------------------------------
\001\015\260\000\000\000\000\000\000\000\000\000\000\000\000
另请参阅
7 - V6_TYPE
返回 INTEGER 值,该值对传递给它的网络地址类型进行分类,如 IETF RFC 4291 第 2.4 部分中所定义。例如,如果将字符串 127.0.0.1
传递给此函数,则返回 2,表示该地址为环回地址。此函数接受 IPv4 和 IPv6 地址。
行为类型
不可变语法
V6_TYPE ( address)
参数
- address
- 包含要描述的 IPv6 或 IPv4 地址的 VARBINARY 或 VARCHAR。
返回
函数返回的值为:
返回值取决于下表的 IP 地址范围:
如果将 NULL 值或无效地址传递给此函数,则此函数返回 NULL。
示例
=> SELECT V6_TYPE(V6_ATON('192.168.2.10'));
v6_type
---------
1
(1 row)
=> SELECT V6_TYPE(V6_ATON('2001:db8::8:800:200c:417a'));
v6_type
---------
0
(1 row)