哪个MySQL数据types用于IP地址?
可能重复:
如何在mySQL中存储一个IP
我想从$_SERVER['REMOTE_ADDR']
和一些其他$_SERVER
variables获得IP地址,哪种数据types是正确的呢?
它是VARCHAR(n)
吗?
由于IPv4地址长度为4个字节,所以可以使用一个完全具有4个字节的INT
( UNSIGNED
) :
`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地址作为一个string- 例如
192.128.0.15
- 例如
- 一个
integer
(4个字节),如果您将IP地址转换为整数-
3229614095
为我以前使用的IP
-
第二个解决scheme将需要更less的数据库空间,并且可能是更好的select,即使在存储和检索数据(将其从string转换为string)中隐含了一些操作。
关于这些操作,请参阅PHP端的ip2long()
和long2ip()
函数,或MySQL端的inet_aton()
和inet_ntoa()
。
对于IPv4地址,可以使用VARCHAR将它们存储为string,但也可以将它们存储为长整数INT(11) UNSIGNED
。 您可以使用MySQL的INET_ATON()
函数将它们转换为整型表示。 这样做的好处是它可以让你对它们进行简单的比较,比如BETWEEN
查询
INET_ATON()MySQL函数