Проблема со вставкой IP-адреса

Анатолий

Новичок
Проблема со вставкой IP-адреса

Думаю многие знают такую MySQL-функцию INET_ATON().
Так вот если вызвать эту функцию просто так, т.е. select INET_ATON('209.207.224.40'); То все ровно, она возвращает 3520061480. Все красиво и замечательно. Но при попытке вставки в таблицу получается какая-то хрень.
Например, запрос:
INSERT INTO `lib_user` (name, ip) VALUES ('sdfgt', INET_ATON('209.207.224.40')); Выполняется нормально, но в поле IP появляется число 2147483647, а вовсе не 3520061480, как должно быть.

name | varchar(255)
ip | int(11)

В чем проблема???
 

Анатолий

Новичок
Т.е. int(11) не подходит?

-~{}~ 09.11.05 22:06:

С BIGINT все работае нормально, но мне кажется это не самое рациональное решение.
 

Анатолий

Новичок
Т.е. хранить IP адрес в виде строки?
А многие наоборот кричат во все горло, что это не рационально и хранить нужно только в численном виде.
Кому верить???
 

svetasmirnova

маленький монстрик
А можно доводы почему только в численном виде?
Под char или decimal отводится фиксированное место. Когда в поле хранится записи заранее неизвестной длины, это нерационально. В остальных же случаях, наоборот, ускоряет работу. IP адрес, как я поняла, как раз остальной случай?
 

kruglov

Новичок
svetasmirnova
Под int unsigned тоже выдается фиксированное место. 4 байта.
Преимущество хранения IP в int - то, что менее ресурсоемко.
Преимущество хранения в char(15) - то, что невооруженным глазом сразу видно, что за IP.
 

chira

Новичок
ещё в варианте с int можно работать с интервалами IP адресов если необходимо ...
 

Анатолий

Новичок
chira
Да, ради этого все и затеял, мне нужно задавать, для каждого полььзователя интервалы адресов. С INT мне показалось это сделать проще всего.
 

Фанат

oncle terrible
Команда форума
если не понимать разницу между signed и unsigned, то пожет оказаться совсем не так просто
 

alan4ick

Guest
а какой алгоритм преобразования ?
xxx.xxx.xxx.xxx=hex=dec ?
 

magic

lancer
На IP выделяется четыре байта. Вот и подумай, как преобразовать четыре байта в xxx.xxx.xxx.xxx :)
 

alexhemp

Новичок
svetasmirnova

Доводы очень простые - согласно стандарту IPv4 адрес является 32-битным беззнаковым целым.

Адресная арифметика естественно рассчитана на работу с такими числами (например определение принадлежат ли адреса одной сети). Если адреса нужно не только хранить, но и выполнять выборки типа - "все адреса что принадлежат такой-то сети" то однозначно - беззнаковое целое.
 
Сверху