【问题标题】:Convert ipv4 and ipv6 addresses to Integer将 ipv4 和 ipv6 地址转换为整数
【发布时间】:2016-10-30 07:25:54
【问题描述】:

我正在尝试将多个 IP 地址 IPv4 和 IPv6 从 86.120.51.222 转换为 1450718174。目前正在尝试构建查询但不太了解 sql

表 ip_city_country_location

+----+---------+---------------+-------------+
| ID | ip_from |     ip_to     |    city     |
+----+---------+---------------+-------------+
| 1  | 1.2.3.4 | 1.255.255.255 | city_name_1 |
| 2  | 1.3.4.4 | 1.6.0.0       | city_name_2 |
| 3. | 1.0.0.0 | 1.5.5.5       | city_name_3 |
+----+---------+---------------+-------------+

我在想什么

UPDATE ip_city_country_location SET ip_from = INET_ATON(SELECT ip_from FROm ip_city_country_location), ip_to = INET_ATON(SELECT ip_to FROm ip_city_country_location);

注意也可以使用CASEWHEN AND THEN 完成,但需要另一个自动转换的解决方案,因为这是一个500万行的数据库并且需要运行它从外壳(xampp)。喜欢用sql或者smth创建函数。

预期输出

+----+---------+---------------+-------------+
| ID | ip_from |     ip_to     |    city     |
+----+---------+---------------+-------------+
| 1  | 16909060 | 33554431      | city_name_1 |
| 2  | 16974852 | 17170432      | city_name_2 |
| 3. | 16777216 | 17106181      | city_name_3 |
+----+---------+---------------+-------------+

【问题讨论】:

  • 你为什么不用这样UPDATE ip_city_country_location SET ip_from = INET_ATON(ip_from), ip_to = INET_ATON(ip_to);

标签: mysql sql linux


【解决方案1】:

您要查找的查询非常简单。

这是查询:

UPDATE ip_city_country_location SET ip_from = INET_ATON(ip_from), ip_to = INET_ATON(ip_to);

注意:

  • 将 ip_addresses 转换为 integer 值后,您应该 将数据类型更改为VARBINARY(16)
  • ip_fromip_to 字段上的索引将加快您的选择 查询。

编辑:

要转换 IPV6 地址,您需要 MySQL 服务器版本 >= 5.6.3

查询如下所示:

UPDATE 
ip_city_country_location 
SET ip_from = IF(IS_IPV6(ip_from),INET6_ATON(ip_from), INET_ATON(ip_from)),         
    ip_to = IF(IS_IPV6(ip_to),INET6_ATON(ip_to), INET_ATON(ip_to));

学分: 感谢@Michael 的宝贵意见。

您不能将 IPv6 地址的等价物存储在整数中 列,因为 IPv6 地址是 128 位长,而最长的整数 MySQL 支持的是 BIGINT UNSIGNED,它只有 64 位。 INET6_ATON() 为 IPv6 地址返回一个 VARBINARY(16)。

【讨论】:

  • 如果我也有 ipv6 条目怎么办,这也适用于他们吗?
  • 你的MySQL是什么版本的?
  • 试过了,它适用于 ipv4,但对于2a0a:2f07:ffff:f,它们被消灭了。我认为是 5.6.16。
  • 您不能将 IPv6 地址的等价物存储在整数列中,因为 IPv6 地址的长度为 128 位,而 MySQL 支持的最长整数是 BIGINT UNSIGNED,只有 64 位。 INET6_ATON() 为 IPv6 地址返回 VARBINARY(16)
  • 正确,VARBINARY(16) 应该这样做。