我想从$_SERVER['REMOTE_ADDR']
和其他一些$_SERVER
变量中获取IP地址,哪种数据类型是正确的?
是VARCHAR(n)
吗?
答案 0 :(得分:134)
由于IPv4地址长度为4个字节,因此您可以使用恰好有4个字节的INT
(UNSIGNED
):
`ipv4` INT UNSIGNED
INSERT INTO `table` (`ipv4`) VALUES (INET_ATON("127.0.0.1"));
SELECT INET_NTOA(`ipv4`) FROM `table`;
对于IPv6地址,您可以使用BINARY
代替:
`ipv6` BINARY(16)
使用PHP’s 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']);
答案 1 :(得分:46)
您有两种可能性(对于IPv4地址):
varchar(15)
,如果您想将IP地址存储为字符串
192.128.0.15
integer
(4个字节),如果您将IP地址转换为整数
3229614095
用于我之前使用的IP
第二个解决方案将需要更少的数据库空间,并且可能是一个更好的选择,即使它在存储和检索数据(将其从/转换为字符串)时意味着一些操作。 / p>
关于这些操作,请参阅PHP端的ip2long()
和long2ip()
函数,或MySQL端的inet_aton()
和inet_ntoa()
。
答案 2 :(得分:5)
对于IPv4地址,您可以使用VARCHAR将它们存储为字符串,但也可以将它们存储为长整数INT(11) UNSIGNED
。您可以使用MySQL的INET_ATON()
函数将它们转换为整数表示。这样做的好处是它允许您对它们进行简单的比较,例如BETWEEN
查询