Подтвердить что ты не робот

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

Возможный дубликат:
Как сохранить IP-адрес в mySQL

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

Это VARCHAR(n)?

4b9b3361

Ответ 1

Поскольку адреса 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)

И используйте PHPs 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']);

Ответ 2

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

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


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

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

Ответ 3

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

Функция INET_ATON() MySQL