Возможный дубликат:
Как сохранить IP-адрес в mySQL
Я хочу получить IP-адрес от $_SERVER['REMOTE_ADDR']
и некоторых других переменных $_SERVER
, какой тип данных является правильным для этого?
Это VARCHAR(n)
?
Возможный дубликат:
Как сохранить 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)
И используйте 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']);
У вас есть две возможности (для 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
. Вы можете использовать функцию MySQL INET_ATON()
, чтобы преобразовать их в целочисленное представление. Преимущество этого в том, что это позволяет вам легко сравнивать их, например BETWEEN
query