2012-01-03 4 views
5

MySQL, пытаясь получить список ip-адресов в порядке.заказ по .... номер? Помогите мне сортировать ip-адреса

этот запрос

select ip from sn_192_168_0 

дает этот

192.168.0.1 
192.168.0.10 
192.168.0.100 
192.168.0.101 

Мы хотим

192.168.0.1 
192.168.0.2 
...snip.. 
192.168.0.10 
+0

У меня нет времени, чтобы построить полный пример прямо сейчас, но то, что он выглядит, это сортировка лексикографически (т.е. по-характеру). Вам нужно будет создать SP (или логику приложения), чтобы заставить его сортировать численно (т. Е. Разбить IP-адрес на четыре части, а затем отсортировать их по каждой из частей). В качестве альтернативы вместо того, чтобы разбивать его на четыре части, сделайте одно целое из IP-адреса (первый октет адреса = первые 8 бит номера, второй октет = второй 8 бит и т. Д.) И отсортируйте по этому - IP-адреса на самом деле не что иное, как хорошо замаскированное целое число. –

+0

@SimonRigharts это именно то, что он делает. Общая философия заключается в том, что было бы быстрее (но более дорогостоящим) конвертировать все в поле большого числа (или использовать четыре новых поля шириной 3 символа или три новых байтовых поля) и запросить отключение для сортировки, но представить это поле для отображения. Существуют библиотеки для преобразования IP-адреса в числовое поле, если вы не хотите выполнять синтаксический анализ самостоятельно. – jcolebrand

+0

Однако, поскольку это действительно просто вопрос кода, загрузите его в [SO]. – jcolebrand

ответ

15

Попробуйте функция INET_ATON

SELECT ip FROM sn_192_168_0 
ORDER BY INET_ATON(ip); 

Попробуйте !!!

CAVEAT: Лучше не хранить значения INET_ATON. Есть некоторые прошлые причуды с этой функцией: у вас есть недопустимые числа между точками и вызов их в триггеры.

Эти ошибки очищаются до сих пор.

Короткие IP-адреса обрабатываются надлежащим образом. Вот пример из MySQL 5.5.12 в ОС Windows 7

mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1'); 
+------------------------+--------------------+ 
| INET_ATON('127.0.0.1') | INET_ATON('127.1') | 
+------------------------+--------------------+ 
|    2130706433 |   2130706433 | 
+------------------------+--------------------+ 
1 row in set (0.05 sec) 
+0

Почему я об этом не думал? Спасибо. –

0

вы можете использовать

SELECT ip FROM sn_192_168_0 ORDER BY LPAD( ip, 16, 0) 

числа 16 является максимальной длиной в ф

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