我正在尝试将多个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);
还可以使用CASE
和WHEN
AND进行通知THEN
,但需要另一个解决方案,该解决方案可以自动转换,因为这是一个500万行的数据库,需要从shell(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);
注意:
integer
value后,应将数据类型更改为VARBINARY(16)
。ip_from
和上ip_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)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句