哪个MySQL数据类型用于IP地址?

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)

INET_ATONINET_NTOA它们转换:

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_ptoninet_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)

  • 5.1的语法是INT UNSIGNED,而不是UNSIGNED INT (6认同)
  • 如果两者都可以呢? (2认同)

Pas*_*TIN 47

您有两种可能性(对于IPv4地址):

  • a varchar(15),如果您想将IP地址存储为字符串
    • 192.128.0.15 例如
  • integer(4个字节),如果你的IP地址转换为整数
    • 3229614095 对于我之前使用的IP


第二种解决方案将需要更少的数据库空间,并且可能是更好的选择,即使它在存储和检索数据(将其从/转换为字符串)时意味着一些操作.

关于这些操作,请参阅PHP端和MySQL端的ip2long()long2ip()函数.inet_aton()inet_ntoa()


Mic*_*ski 5

对于IPv4地址,您可以使用VARCHAR将它们存储为字符串,但也可以将它们存储为长整数INT(11) UNSIGNED.您可以使用MySQL的INET_ATON() 函数将它们转换为整数表示.这样做的好处是它允许您对它们进行简单的比较,例如BETWEEN查询

INET_ATON()MySQL函数