如何解决将 CIDR 格式的 IPv6 范围转换为 MySQL 中的 IPv6 地址范围开始和结束 ips
我正在尝试将 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,network) - 1)) + (POW(2,(32-CONVERT(SUBSTRING(network,network) + 1),UNSIGNED INT)))-1)
用于 end_ip。 network 是存储 CIDR 范围的字段的名称。
但是,这不适用于 CIDR 格式的 IPv6 地址范围。我尝试使用 INET6_ATON 而不是 INET_ATON 但它给了我一个数值超出范围的错误。我对 IPv6 地址了解不多,所以自己找一个公式并不容易。
感谢任何帮助。
解决方法
使用类型为 VARBINARY(16) 的列来存储值。 您可以将 INET6_ATON 用于 IPv4 和 IPv6 地址。
参考:https://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。