查询Maxmind GeoLite2 City阻止SQL Server中的csv获取IPv6和IPv4地址的geoname_id

Rei*_*eid 2 t-sql sql-server ipv4 ipv6 maxmind

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

我查看了在SQL中查询GeoLite2国家CSV,但我根本不明白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地址的proc,并返回相关位置或geoname_id?

arn*_*nep 7

我使用此查询(实际上是它的MySQL)来导入块文件,将IP地址转换为从 - 到IP范围以进行简单BETWEEN查询.

我在表格中添加了两个字段:start_ipend_ip.start_ip填充了数值network_start_ip,end_ip填充了使用的计算出的ip范围的结尾network_mask_length.正如@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
Run Code Online (Sandbox Code Playgroud)

使用查询数据

SELECT geoname_id
FROM geoip_blocks
WHERE
INET_ATON('123.123.123.123') BETWEEN start_ip AND end_ip
LIMIT 1
Run Code Online (Sandbox Code Playgroud)