Oracle:将IPv4地址转换为数字?

Mar*_*son 3 oracle ip

如何将点分十进制格式的IPv4地址转换为数字?例如,地址39.255.2.51应转换为4026466867.

Mar*_*son 6

  • 使用regexp_substr提取地址的四个八位字节.
  • 通过将八位字节移回原始位置来重构该值.

regexp可能相对昂贵,所以如果你这么做很多,你可以考虑在表中缓存表中的数值和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 
Run Code Online (Sandbox Code Playgroud)

为了完整起见,这里是另一种方式.

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                                                                                                                                                                                                                                                     
Run Code Online (Sandbox Code Playgroud)