【问题标题】:Which MySQL datatype to use for an IP address? [duplicate]哪个 MySQL 数据类型用于 IP 地址? [复制]
【发布时间】:2011-07-05 06:01:06
【问题描述】:

可能重复:
How to store an IP in mySQL

我想从$_SERVER['REMOTE_ADDR'] 和其他一些$_SERVER 变量中获取IP 地址,哪种数据类型适合这个?

VARCHAR(n)吗?

【问题讨论】:

  • 看到这个discussion
  • 我不同意这是一个重复的问题,因为另一个问题是专门用于存储大量 IP 地址的与性能相关的问题。该问题的答案可能与对最大化空间使用或性能不感兴趣的人无关。
  • @User 我在一年半前问过这个问题;)但是感谢您分享您的意见。
  • 即使这个问题可能重复。在这里我找到了更好的答案。那些将其标记为重复的人,让我浪费了我的时间:-P
  • 任何人都可以将其取消标记为重复。真正的答案就在这个问题中。

标签: php mysql types ip-address


【解决方案1】:

由于 IPv4 地址是 4 个字节长,您可以使用正好有 4 个字节的INT (UNSIGNED)

`ipv4` INT UNSIGNED

还有INET_ATONINET_NTOA 来转换它们:

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_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']);

【讨论】:

  • 5.1 的语法是 INT UNSIGNED,而不是 UNSIGNED INT
  • 使用建议的方法 - 如何找到匹配子网的地址?
  • @AlexanderFarber Check if IP is in subnet
  • 如果两者都可以呢?
  • 新更新:INET6_ATON() 用于 IPV6 INET6_NTOA()
【解决方案2】:

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

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


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

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

【讨论】:

【解决方案3】:

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

INET_ATON() MySQL function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2011-07-26
    • 2018-09-22
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多