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

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

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

Это VARCHAR(n) ?

    Поскольку адреса 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 для хранения их в виде строк, но также и для их хранения в виде long integesrs INT(11) UNSIGNED . Вы можете использовать INET_ATON() MySQL для преобразования их в целочисленное представление. Преимущество этого заключается в том, что вы можете легко сравнивать их, например, BETWEEN запросы

    INET_ATON () Функция MySQL