微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mysql – 检查ipv6是否在范围内

我有maxmind的ipv6数据.这是我当前的表(带有示例数据):

+---------------+------------+
|    network    | geoname_id |
+---------------+------------+
| 2001:208::/32 |        123 |
| 2001:218::/32 |       4312 |
+---------------+------------+

使用their converter,我可以创建network_start_ip和network_last_ip列:

+------------------+----------------------------------------+------------+
| network_start_ip |            network_last_ip             | geoname_id |
+------------------+----------------------------------------+------------+
| 2001:200::       | 2001:200:ffff:ffff:ffff:ffff:ffff:ffff |        123 |
| 2001:208::       | 2001:208:ffff:ffff:ffff:ffff:ffff:ffff |       4312 |
+------------------+----------------------------------------+------------+

我期待这样的东西会起作用(即使它可能比其他方法慢):

SELECT b.geoname_id FROM blocks b 
WHERE HEX(INET6_ATON('2001:201:ffff:ffff:ffff:ffff:ffff:ffff')) BETWEEN HEX(b.network_start_ip) AND HEX(b.network_last_ip)

那么,我错过了什么?另外,存储ipv6地址(范围)的最佳方法是什么

谢谢

解决方法:

以下是我的工作方式:

>创建了具有相同列的另一个表,但network_start_ip和network_last_ip是VARBINARY(16)
>使用以下语句填充该表:INSERT INTO块
SELECT INET6_ATON(b2.network_start_ip),INET6_ATON(b2.network_last_ip),b2.geoname_id FROM blocks_copy b2;
>然后,要检查IPv6地址是否在范围内,我只需要运行此查询:SELECT geoname_id FROM blocks b
INERE6_ATON(‘2a01:4ff:ffff:ffff :: ffff’)BETWEEN b.network_start_ip和b.network_last_ip

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐