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

2022-08-30 07:37:27

可能的重复:
如何在mySQL中存储IP

我想从和其他一些变量中获取IP地址,哪种数据类型是正确的?$_SERVER['REMOTE_ADDR']$_SERVER

是吗?VARCHAR(n)


答案 1

由于 IPv4 地址的长度为 4 个字节,因此可以使用正好包含 4 个字节的 INT无符号):

`ipv4` INT UNSIGNED

INET_ATONINET_NTOA转换它们:

INSERT INTO `table` (`ipv4`) VALUES (INET_ATON("127.0.0.1"));
SELECT INET_NTOA(`ipv4`) FROM `table`;

对于 IPv6 地址,您可以改用二进制文件:

`ipv6` BINARY(16)

并使用 PHP 的inet_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']);

答案 2

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

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


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

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


推荐