【问题标题】:Querying GeoLite2 Country CSV in SQL在 SQL 中查询 GeoLite2 Country CSV
【发布时间】:2014-03-26 23:42:52
【问题描述】:

有谁知道如何使用 SQL 从 MaxMind 的 GeoLite2 Country CSV 中查找 IP4 地址?

我多年来一直在使用 MaxMind 的免费 G​​eoIP 数据,并希望升级到他们的 GeoLite2 数据。我将块和位置数据加载到 MySQL 表中,但不确定如何确定 IP4 地址所属的地址范围。旧格式的每个块都有一个开始/结束编号;新格式似乎只有一个起始编号。

我已经搜索了 MaxMind 开发人员文档,并在 Google 上搜索过,但似乎找不到任何有关如何查询新格式的信息。我确信这很明显,如果我在此期间弄明白,我会编辑这篇文章。

认为谢谢,我必须找到大于或等于 IP4 地址和 LIMIT 1 的第一个块条目。

我将这些数据用于 Web 应用程序外观,以及直接在 SQL 中查询以生成报告;所以我通常需要确保我可以在 Perl 代码和纯 SQL 中实现查找。

我正在升级,因为我在旧数据上看到了一些似乎来自法国的日本游客的有趣结果。

非常感谢

【问题讨论】:

    标签: geoip maxmind


    【解决方案1】:

    Geolite2 CSV中使用的地址格式包括一个块IP地址开始,后跟一个前缀长度#,可以转换成块IP地址结束。

    (有点令人困惑的是,Maxmind 使用“Network_Mask_Length”而不是“Prefix_Length”,即公认的 IPv6 术语来标记此字段。)

    Geolite2 CSV 的块字段布局:

    network_start_ip,network_mask_length,geoname_id,registered_country_geoname_id,re
    presented_country_geoname_id,postal_code,latitude,longitude,is_anonymous_proxy,i
    s_satellite_provider
    

    示例:(从 Geolite2-Country-Blocks.csv 中提取的记录)

    ::ffff:81.248.136.0,120,3578476,3017382,,,,,0,0
    

    鉴于上述示例,分配给该块的最后一个 IPv4 地址是什么?

    First IP address: 81.248.136.0
    Prefix_Length/Network_mask_Length: 120
    Last IP address: 81.248.136.255
    

    以下 URL 可能有助于快速查找特定 Prefix_Length 可用的 IP 地址数量:

    http://www.gestioip.net/cgi-bin/subnet_calculator.cgi

    __菲利普

    【讨论】:

    • 啊哈!非常感谢__philippe,这太完美了。由于我缺乏网络知识,我没有意识到 network_mask_length 是其中的关键。我现在可以看到它与起始地址之间的关系。非常感谢!
    • 这对我也很有帮助。不过,作为一个没有大量使用 IP 地址经验的人,我无法理解如何在给定第一个 IP 地址和前缀长度/网络掩码长度的情况下计算最后一个 IP 地址。我检查了计算器,但我不确定如何使用它。谢谢!
    • 具体来说,您介意解释一下您是如何从 81.248.136.0 和 120 获得 81.248.136.255 的吗?
    • @EricFreese,首先从前缀长度中减去 MaxMind 的填充:120 - 96 = 24。然后保留第一个地址的前 24 位并将剩余的每个位设置为 1。
    【解决方案2】:

    Prefix_Length 计算器用法:

    (在这种情况下,与其说是计算器,不如说是一个简单的查表工具,真的...;-)

    http://www.gestioip.net/cgi-bin/subnet_calculator.cgi

    在计算器中,勾选 IPv6 按钮,然后单击 PL 框向下箭头。 将显示“前缀长度”列表,以及相应的可用 IP 地址数。

    要确定任何 Geolite2 块的最后一个 IP 地址,以下 Prefix_Length/地址对的相关范围很可能就足够了:

    Prefix  #addresses
    Length
    
    117 2048
    118 1024
    119 512
    120 256
    121 128
    122 64
    123 32
    124 16
    125 8
    126 4
    127 2
    128 1
    

    请注意,Geolite2 文件结构遵循一种混合 IPv4/IPv6 表示法的形式,即 “IPv4 映射的 IPv6 地址”。

    这些“混合”地址以标准 IPv6 格式的前 96 位写入,其余 32 位以 IPv4 的习惯点十进制表示法写入。 例如 ::ffff:192.0.2.128 代表 IPv4 地址 192.0.2.128

    有关这个非常(多毛)的主题的更多信息,请点击此处:

    http://en.wikipedia.org/wiki/IPv6

    __菲利普

    【讨论】:

    • 我们可以用 postgreSQL 实现这个案例吗?或通过 SQL 查询执行此操作的任何建议?
    猜你喜欢
    • 2014-09-04
    • 2020-08-22
    • 2014-03-30
    • 1970-01-01
    • 2020-04-24
    • 2015-02-09
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    相关资源
    最近更新 更多