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

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

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

Это VARCHAR(n)?

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):

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


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

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

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

INET_ATON() функция MySQL

Другие вопросы по тегам