sql-server - 在 SQL Server 中查询 Maxmind GeoLite2 City Blocks csv 以获取 IPv6 和 IPv4 地址的 geoname_id

标签 sql-server tsql ipv6 ipv4 maxmind

Maxmind 有两个免费的 GeoLite2 cvs 文件,我们可以使用它们来查找与 IP 地址范围相关的位置。我想在使用导入表([GeoLite2_City_Blocks] 和 [GeoLite2_City_Locations])的 SQL Server 中创建一个存储过程,采用传入 IP 地址的 varchar(45) 字符串并返回与该 IP 地址关联的位置。我原以为网络上会有相关的 T-SQL 代码,但我找不到。

我 checkout Querying GeoLite2 Country CSV in SQL ,但我根本不明白 Prefix_Length(在 Blocks 表中称为 Network_mask_Length)是做什么的。如果它们与 CIDR 前缀相同(请参阅:http://en.wikipedia.org/wiki/IPv6_subnetting_reference),我会更加困惑,因为 Network_mask_Length 可能是 118、119 或该维基百科页面上未显示的任何其他数字。

我在 SQL Server 中看到一个讨论 IPv6 的网页,该网页建议用零填充以进行比较。我想免费的 GeoLite2 不能简单地被查询,除非至少在表中添加一个额外的列来表示范围的结束 IP 地址吗?

我想我可以从 IPv4 地址前面去掉“::ffff:”,如果这是正确的说法的话。但我仍然不知道如何将 network_mask_length(前缀)字段翻译成我理解的内容。然后用零填充 IPv6 地址,但我仍然不知道该前缀是什么。

我的问题是:

  1. 是否有可以让我走上正轨的示例代码?或者,
  2. 我需要做什么才能创建一个接受 IPv4 或 IPv6 地址并返回相关位置或 geoname_id 的过程?

最佳答案

我使用这个查询(实际上是它的 MySQL)来导入 block 文件,将 IP 地址转换为从到 ip 范围来做一个简单的 BETWEEN查询。

我在表中添加了两个字段:start_ipend_ip . start_ip填充为network_start_ip的数值, end_ip填充了使用 network_mask_length 计算的 ip 范围的末尾.正如@oschwald 指出的那样,我从前缀长度中减去 96 并删除了::FFFF:。

LOAD DATA LOCAL INFILE 'GeoLite2-City-Blocks.csv' 
INTO TABLE geoip_blocks 
COLUMNS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
LINES STARTING BY '::ffff:' -- import only ipv4 and cut off the ipv6 prefix
IGNORE 2 LINES 
(network_start_ip, network_mask_length, geoname_id, 
  registered_country_geoname_id, represented_country_geoname_id, postal_code, 
  latitude, longitude, is_anonymous_proxy, is_satellite_provider)
SET start_ip = inet_aton(network_start_ip),  -- set start ip as given
  end_ip = inet_aton(network_start_ip) + 
   (pow(2, (32 - (network_mask_length -96))) - 1) - 1, -- calc end_ip using mask
  network_mask_length = network_mask_length - 96 -- subtract 96 as we use ipv4

使用查询数据

SELECT geoname_id
FROM geoip_blocks
WHERE
INET_ATON('123.123.123.123') BETWEEN start_ip AND end_ip
LIMIT 1

关于sql-server - 在 SQL Server 中查询 Maxmind GeoLite2 City Blocks csv 以获取 IPv6 和 IPv4 地址的 geoname_id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22062647/

相关文章:

c# - 尝试将 SqlDataAdapter 中的 SqlCommand 作为参数传递

sql - Sql 精简版的 CHECK/NOCHECK

sql-server - T-SQL 分配产品发布之间的运行天数,在产品发布时重置为零

sql-server - 我怎样才能让这个查询返回 0 而不是 null?

python将ipv6转换为整数

c# - 有人试图侵入我的网站

sql-server - 在 SQL CLR 程序集中配置远程数据库连接字符串

sql - 如何对连续的行进行分组?

javascript - 使用 IPv6 地址和 javascript 从网页获取 html

C# IPv4/IPv6 不可知套接字监听器