我正在尝试将多个IP地址IPv4和IPv6从86.120.51.222转换为1450718174.目前正在尝试构建查询但不了解sql
TABLE ip_city_country_location
node_modules
我在想什么
+----+---------+---------------+-------------+
| 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
AND WHEN
完成,但还需要另一个自动转换的解决方案,因为这是 500万行的dbs 并且需要从shell(xampp)运行它。喜欢在sql或smth中创建一个函数。
预期输出
THEN
答案 0 :(得分:2)
您正在寻找的查询非常简单。
以下是查询:
UPDATE ip_city_country_location SET ip_from = INET_ATON(ip_from), ip_to = INET_ATON(ip_to);
注意:强>
integer
值后,您应该这样做
将数据类型更改为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)。