2016-03-21 4 views
1

У меня есть адреса ipv6, хранящиеся в десятичном формате (39,0) без знака.Как преобразовать двоичный код в десятичный (39,0) в MySQL?

Мне нужно запросить базу данных. Я использую INET6_ATON(), который преобразует ipv6 в двоичный. Теперь мне нужно преобразовать этот двоичный код в десятичный (39,0).

Возможно ли это в чистом MySQL?

ответ

1

Да, возможно. Поскольку DECIMAL представления IPv6 больше, чем максимальное значение 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-адреса одинаковы, я поместил их в другом формате, чтобы проверить, работает ли скрипт правильно.

Смежные вопросы