【发布时间】:2014-03-30 12:51:48
【问题描述】:
Maxmind 有两个免费的 GeoLite2 cvs 文件,我们可以使用它们来查找与 IP 地址范围相关的位置。我想在 SQL Server 中创建一个存储过程,该过程使用导入的表([GeoLite2_City_Blocks] 和 [GeoLite2_City_Locations]),采用传入 IP 地址的 varchar(45) 字符串并返回与该 IP 地址关联的位置。我原以为网上会有相关的 T-SQL 代码,但我找不到。
我查看了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 地址,但我仍然不知道那个前缀是什么。
我的问题是:
- 是否有任何可用的示例代码可以让我走上正轨?或者,
- 我需要做什么来创建一个接受 IPv4 或 IPv6 地址并返回相关位置或 geoname_id 的 proc?
【问题讨论】:
-
你不应该在其中看到任何长于 /64 的前缀。
-
@MichaelHampton,这不是真的。尽管对于公共 IPv6 地址,您不太可能看到任何长于 /64 的前缀,但对于 IPv4 映射地址(例如 ::FFFF:1.1.1.1),您会看到更长的前缀。
-
此外,数据库不是子网到位置的映射,而是IP范围到位置的映射。尽管 IPv6 子网的某些功能会因小于 /64 的子网(例如 SLAAC)而中断,但这在这里并不重要。没有理由不存在设备位置已知的特定 /128 地址的映射。
-
@oschwald 是的,但您不应该在这个特定的数据库中看到 IPv4 映射的地址。
-
@MichaelHampton,这就是在alpha GeoLite2 CSVs 中包含 IPv4 地址的方式。您可能会想到旧版 CSV。
标签: sql-server tsql ipv6 ipv4 maxmind