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