【发布时间】:2019-02-25 10:43:20
【问题描述】:
如何将点十进制格式的 IPv4 地址转换为数字?例如地址39.255.2.51应转换为4026466867。
【问题讨论】:
如何将点十进制格式的 IPv4 地址转换为数字?例如地址39.255.2.51应转换为4026466867。
【问题讨论】:
正则表达式可能相对昂贵,因此如果您经常这样做,您可能会考虑将数值与 IP 地址一起缓存在表中。
with addr as (select '239.255.2.51' ip from dual)
select ip, to_number(regexp_substr(ip, '\d+', 1, 1)) * 16777216 +
to_number(regexp_substr(ip, '\d+', 1, 2)) * 65536 +
to_number(regexp_substr(ip, '\d+', 1, 3)) * 256 +
to_number(regexp_substr(ip, '\d+', 1, 4)) n
from addr;
IP N
------------- ----------
239.255.2.51 4026466867
为了完整起见,这里是另一种方式。
with addr as (select 4026466867 n from dual)
select n, mod(trunc(n/16777216),256) ||'.'||
mod(trunc(n/65536), 256) ||'.'||
mod(trunc(n/256), 256) ||'.'||
mod(n, 256) ip
from addr;
N IP
---------- ------------
4026466867 239.255.2.51
【讨论】:
我的需求主要是 int > IP,偶尔有负整数。对于负值,马克的答案不起作用;每个八位字节都作为负数返回。
这就是我想出的适用于正整数和负整数的方法,至少对于我所看到的许多示例都是如此。 (这应该适用于除 SQL 服务器之外的大多数数据库 - 您需要在那里使用 '%' 函数。)
select
mod(mod(floor(ip/16777216),256) + 256, 256) ||'.'||
mod(mod(floor(ip/65536), 256) + 256, 256) ||'.'||
mod(mod(floor(ip/256), 256) + 256, 256) ||'.'||
mod(mod(ip, 256) + 256, 256) as decoded_ip
from addr;
对负数计算 mod 的方法取自这里: Mod negative numbers in SQL just like excel
【讨论】: