我使用十进制(39,0)无符号格式存储ipv6地址。
我需要查询数据库。我使用INET6_ATON(),它将ipv6转换为二进制。现在我需要将二进制转换为十进制(39,0)。
这在纯MySQL中是可能的吗?
发布于 2016-03-21 10:02:00
是的,有可能。由于DECIMAL表示的IPv6大于最大64位整数(18,446,744,073,709,551,615),所以必须将“string”拆分到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 setSQL语句:
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注意,最后两个is是相同的,为了测试脚本是否正常工作,我将它们放在不同的格式中。
https://stackoverflow.com/questions/36126640
复制相似问题