Хранение ip-адресов в БД

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Хранение ip-адресов в БД

Сообщение VVitafresh » 30.07.2007 (Пн) 14:21

В БД нужно хранить ip-адреса.
Если хранить его в поле с типом varchar, то сортировка будет не очень удобная
192.168.1.1
192.168.1.12
192.168.1.2
и т.д.
Пока вижу только вариант хранить разряды по отдельности в четырех полях (int) и сортировать записи уже по ним. Но такой способ хранения ip мне кажется не очень наглядным.

Есть какие-то другие более оптимальные способы? Или по другому спрошу: кто как предпочитает хранить ip?
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.07.2007 (Пн) 14:25

Не вижу смысла сортировать IP-адреса каким то образом.

Типа "А остортируй ко мне прога IP адреса по второму октету!". Зачем это может быть нужно?

Ну а вообще, я, например, храню их в hex-представлении.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 30.07.2007 (Пн) 14:29

Хакер писал(а):Не вижу смысла сортировать IP-адреса каким то образом.
Типа "А остортируй ко мне прога IP адреса по второму октету!". Зачем это может быть нужно?

Для админов, которые раздают статические ip-адреса, и хотят визуально видеть, какие ip свободны и в каком диапазоне (ну привыкли они так выбирать).
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.07.2007 (Пн) 15:11

В Long храни.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Хранение ip-адресов в БД

Сообщение Andrey Fedorov » 30.07.2007 (Пн) 15:13

VVitafresh писал(а):Есть какие-то другие более оптимальные способы? Или по другому спрошу: кто как предпочитает хранить ip?


IP-шки сам не хранил.
Но если хочешь с возможностью сортировки, то храни их байтики в раздельных полях. Да, про IP-6 не забудь.

А наглядность юзеру - дык кто сказал что на экран должно выводиться так-же как и хранится?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 30.07.2007 (Пн) 16:43

alibek писал(а):В Long храни.

alibek, а нельзя чуть подробнее об этом варианте (как ip конвертить в long и обратно)?

Andrey Fedorov писал(а):если хочешь с возможностью сортировки, то храни их байтики в раздельных полях. Да, про IP-6 не забудь.

А наглядность юзеру - дык кто сказал что на экран должно выводиться так-же как и хранится?

Пока на этом варианте и остановился. Точнее решил сделать и varchar и раздельно "по байтикам" -- база небольшая, места не жалко. Выводить буду varchar, сортировать "по байтикам".
А про IP-6 я как раз "забуду", т.к. в локалке его использовать в обозримом будущем не предполагается.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.07.2007 (Пн) 16:45

VVitafresh
Каждый октет - байт лонга. Что тут конвертить то?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.07.2007 (Вт) 6:58

VVitafresh писал(а):alibek, а нельзя чуть подробнее об этом варианте (как ip конвертить в long и обратно)?

Long -- это четыре байта, каждый байт является октетом IP-адреса.
Преобразуется элементарно. При использовании CopyMemory это будет просто перенос между байтовым массивом из четырех элементов и переменной Long. При использовании только математики и логических операторов тоже ничего сложного нет, надо только учитывать знаковый разряд.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 31.07.2007 (Вт) 7:57

VVitafresh писал(а):Пока на этом варианте и остановился. Точнее решил сделать и varchar и раздельно "по байтикам" -- база небольшая, места не жалко. Выводить буду varchar, сортировать "по байтикам".


Нафига лишнее поле-то?

Код: Выделить всё
SELECT CAST(ip1 AS varchar)+'.'
      +CAST(ip2 AS varchar)+'.'
      +CAST(ip3 AS varchar)+'.'
      +CAST(ip4 AS varchar) AS IP
   FROM IPAddr
   ORDER BY ip1, ip2, ip3, ip4


Итого - ничего лишнего, все просто и всего 4-ре байта на запись...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 31.07.2007 (Вт) 11:22

Andrey Fedorov, да просто чтобы не заморачиваться потом с фильтром и поиском. Если varchar, то все легко: что пользователь ввел, то и ищем -- никаких лишних действий.

Насчет хранения в long, вообще не представляю как делать потом фильтр.

Программка то простая -- фактически только учет ip (данные о юзерах) с проверкой их доступности, не хочу тратить на нее много времени, поэтому упрощаю себе задачу.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 31.07.2007 (Вт) 11:24

Насчет хранения в long, вообще не представляю как делать потом фильтр.


Ну если bitwise and есть, то легко :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 31.07.2007 (Вт) 11:41

Хакер, ну не привых я работать с байтиками по отдельности. Поэтому легкие для тебя варианты реализации для меня не столь очевидны :)
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 31.07.2007 (Вт) 11:47

Ну, что такое "маска подсети" ты ведь знаешь?

Точно такую же маску можно применить для филтрации.


Например "покажите мне все адреса формата 192.168.*.5"

select ... where ip_addr & &hFFFF00FF = &hC0A80005


Прим.:
1) Не знаю как в mssql записываются хекс-числа, поэтому написал в vb-style.
2) &hC0A80005 это 192.168.0.5 в hex-представлении.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 31.07.2007 (Вт) 11:49

Замечу, что в MediaWiki адреса хранятся в виде строк. И поэтому фильтрация возможна только по маскам /8, /16, /24. И это всех устраивает.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.07.2007 (Вт) 14:01

tyomitch писал(а):Замечу, что в MediaWiki адреса хранятся в виде строк. И поэтому фильтрация возможна только по маскам /8, /16, /24.

Ты ничего не перепутал? :)
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 111

    TopList