将 CIDR 格式的 IPv6 范围转换为 MySQL 中的 IPv6 地址范围(开始和结束 ips)

时间:2021-04-03 11:03:23

标签: mysql ipv6 cidr geolite2

我正在尝试将 GeoLite2 ip 导入国家 csv 文件到我的 MySQL 数据库。我能够成功地做到这一点,但是,要使用它在我的查询中搜索 IP,我需要在 ipv4 和 ipv6 表中再创建两个字段,以存储给定的每个 CIDR 范围的 start_ip 和 end_ip 值(GeoLite csv 文件仅以 CIDR 格式指定范围)。

我能够使用此处给出的解决方案将其正确转换为 ipv4 地址范围 Importing MaxMind's GeoLite2 to MySQL

所以我用了

INET_ATON(SUBSTRING(network, 1, LOCATE('/', network) - 1))

对于 start_ip 和

INET_ATON(SUBSTRING(network, 1, LOCATE('/', network) - 1)) + (POW(2, (32-CONVERT(SUBSTRING(network, LOCATE('/', network) + 1), UNSIGNED INT)))-1)

用于 end_ip。 network 是存储 CIDR 范围的字段的名称。

但是,这不适用于 CIDR 格式的 IPv6 地址范围。我尝试使用 INET6_ATON 而不是 INET_ATON 但它给了我一个数值超出范围的错误。我对 IPv6 地址了解不多,所以自己找一个公式并不容易。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

使用类型为 VARBINARY(16) 的列来存储值。 您可以将 INET6_ATON 用于 IPv4 和 IPv6 地址。

参考:https://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton

相关问题