【问题标题】:Oracle: Converting an IPv4 address to a number?Oracle:将 IPv4 地址转换为数字?
【发布时间】:2019-02-25 10:43:20
【问题描述】:

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

【问题讨论】:

    标签: oracle ip


    【解决方案1】:
    • 使用 regexp_substr 提取地址的四个八位字节。
    • 通过将八位字节移回其原始位置来重构该值。

    正则表达式可能相对昂贵,因此如果您经常这样做,您可能会考虑将数值与 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                                                                                                                                                                                                                                                     
    

    【讨论】:

      【解决方案2】:

      我的需求主要是 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

      【讨论】:

        猜你喜欢
        • 2011-02-16
        • 1970-01-01
        • 1970-01-01
        • 2018-01-23
        • 2010-12-06
        • 2014-03-03
        • 2014-03-30
        • 1970-01-01
        • 2018-05-02
        相关资源
        最近更新 更多