Com*_*eek 91 php mysql types ip-address
可能重复:
如何在mySQL中存储IP
我想获取IP地址$_SERVER['REMOTE_ADDR']
和其他一些$_SERVER
变量,哪种数据类型是正确的?
是VARCHAR(n)
吗?
Gum*_*mbo 137
由于IPv4地址长度为4个字节,因此您可以使用恰好包含4个字节的INT
(UNSIGNED
):
`ipv4` INT UNSIGNED
Run Code Online (Sandbox Code Playgroud)
INSERT INTO `table` (`ipv4`) VALUES (INET_ATON("127.0.0.1"));
SELECT INET_NTOA(`ipv4`) FROM `table`;
Run Code Online (Sandbox Code Playgroud)
对于IPv6地址,您可以使用BINARY
:
`ipv6` BINARY(16)
Run Code Online (Sandbox Code Playgroud)
并使用PHPinet_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']);
Run Code Online (Sandbox Code Playgroud)
Pas*_*TIN 47
您有两种可能性(对于IPv4地址):
varchar(15)
,如果您想将IP地址存储为字符串
192.128.0.15
例如integer
(4个字节),如果你的IP地址转换为整数
3229614095
对于我之前使用的IP
第二种解决方案将需要更少的数据库空间,并且可能是更好的选择,即使它在存储和检索数据(将其从/转换为字符串)时意味着一些操作.
关于这些操作,请参阅PHP端和MySQL端的ip2long()
和long2ip()
函数.inet_aton()
inet_ntoa()
对于IPv4地址,您可以使用VARCHAR将它们存储为字符串,但也可以将它们存储为长整数INT(11) UNSIGNED
.您可以使用MySQL的INET_ATON()
函数将它们转换为整数表示.这样做的好处是它允许您对它们进行简单的比较,例如BETWEEN
查询