如何在MySQL中将二进制转换为十进制(39,0)?

时间:2016-03-21 09:00:10

标签: mysql

我有以十进制(39,0)无符号格式存储的ipv6地址。

我需要查询数据库。我使用INET6_ATON()将ipv6转换为二进制。现在我需要将该二进制文件转换为十进制(39,0)。

这在纯MySQL中是否可行?

1 个答案:

答案 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是相同的,我已经将它们放在不同的格式中以便测试脚本是否正常工作。