Какой тип данных MySQL использовать для IP-адреса? [дубликат]


Возможные Дубликаты:
как хранить IP в mySQL

Я хочу получить IP-адрес из $_SERVER['REMOTE_ADDR'] и другие $_SERVER переменные, какой тип данных является правильным для этого?

это VARCHAR(n)?

3 87

3 ответа:

поскольку IPv4-адреса имеют длину 4 байта, вы можете использовать INT (UNSIGNED) это имеет ровно 4 байта:

`ipv4` INT UNSIGNED

и INET_ATON и INET_NTOA преобразовать их:

INSERT INTO `table` (`ipv4`) VALUES (INET_ATON("127.0.0.1"));
SELECT INET_NTOA(`ipv4`) FROM `table`;

для IPv6 адресов вы можете использовать BINARY вместо:

`ipv6` BINARY(16)

и использовать PHP inet_pton и inet_ntop для преобразования:

'INSERT INTO `table` (`ipv6`) VALUES ("'.mysqli_real_escape_string(inet_pton('2001:4860:a005::68')).'")'
'SELECT `ipv6` FROM `table`'
$ipv6 = inet_pton($row['ipv6']);

у вас есть две возможности (для IPv4-адреса) :

  • a varchar(15), если хотите сохранить IP-адрес в виде строки
    • 192.128.0.15 например
  • an integer (4 байта), если вы преобразовать IP-адрес в целое число
    • 3229614095 для IP, который я использовал раньше


Второе решение потребует меньше места в база данных, и, вероятно, лучший выбор, даже если это подразумевает немного манипуляций при хранении и получении данных (преобразование его из / в строку).

об этих манипуляциях смотрите в ip2long() и long2ip() функции на PHP-стороне, или inet_aton() и inet_ntoa() на стороне MySQL.

для IPv4-адресов вы можете использовать VARCHAR для хранения их в виде строк, но также смотрите на их хранение как длинные integesrs INT(11) UNSIGNED. Вы можете использовать MySQL в INET_ATON() функция для преобразования их в целочисленное представление. Преимущество этого заключается в том, что он позволяет легко сравнивать их, например BETWEEN запросы

Inet_aton () MySQL function