Какой тип данных 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-адреса) :
- 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
запросы