我有以十进制(39,0)无符号格式存储的ipv6地址。
我需要查询数据库。我使用INET6_ATON()将ipv6转换为二进制。现在我需要将该二进制文件转换为十进制(39,0)。
这在纯MySQL中是否可行?
答案 0 :(得分:1)
是的,是可能的。由于IPv6的DECIMAL
表示大于最大64位整数(18,446,744,073,709,551,615),因此必须拆分'字符串'最多16个字符,然后将它们一起添加:
示例表:
mysql> select * from ip_table;
+----+-----------------------------------------+
| id | ipv6 |
+----+-----------------------------------------+
| 1 | 2001:db8:a0b:12f0::1 |
| 2 | 3731:54:65fe:2::a7 |
| 3 | FE80:0000:0000:0000:0202:B3FF:FE1E:8329 |
| 4 | FE80::0202:B3FF:FE1E:8329 |
+----+-----------------------------------------+
4 rows in set
SQL语句:
select id,
(
cast(conv(substr(HEX(INET6_ATON(t.`ipv6`)), 1, 16), 16, 10) as decimal(65))*18446744073709551616 +
cast(conv(substr(HEX(INET6_ATON(t.`ipv6`)), 17, 16), 16, 10) as decimal(65))
) as converted
from ip_table t
结果:
+----+-----------------------------------------+
| id | converted |
+----+-----------------------------------------+
| 1 | 42540766414390830568948465903729639425 |
| 2 | 73361969000969283948743196392239923367 |
| 3 | 338288524927261089654163772891438416681 |
| 4 | 338288524927261089654163772891438416681 |
+----+-----------------------------------------+
4 rows in set
请注意,最后两个IP是相同的,我已经将它们放在不同的格式中以便测试脚本是否正常工作。