【问题标题】:Most efficient way to store IP Address in MySQL [duplicate]在MySQL中存储IP地址的最有效方法[重复]
【发布时间】:2011-02-02 06:37:44
【问题描述】:

在 MySQL 中存储和检索 IP 地址的最有效方法是什么?现在我在做:

SELECT * FROM logins WHERE ip = '1.2.3.4'

其中 ip 是 VARCHAR(15) 字段。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 好的,所以你的程序坏了,或者根本不能用 IPv6 运行......叹息。

标签: mysql sql ip-address


【解决方案1】:

对于IPv4 addresses,您可能希望将它们存储为int unsigned,并使用INET_ATON()INET_NTOA() 函数从其数值返回IP 地址,反之亦然。

例子:

SELECT INET_ATON('127.0.0.1');

+------------------------+
| INET_ATON('127.0.0.1') |
+------------------------+
|             2130706433 | 
+------------------------+
1 row in set (0.00 sec)


SELECT INET_NTOA('2130706433');

+-------------------------+
| INET_NTOA('2130706433') |
+-------------------------+
| 127.0.0.1               | 
+-------------------------+
1 row in set (0.02 sec)

【讨论】:

  • 您不会存储为INT,而是INT UNSIGNED。我喜欢使用故意内置的功能。 +1
  • 谢谢。不知道有没有这方面的python函数?
  • IPv6 怎么样?
  • 对于 IPv6IPv4 使用函数INET6_ATON()
  • 对于 IPv6,我在选择 IP 地址时得到了 NULL,后来我明白为了可读性而将 INET6_NTOA 与 HEX() 和 UNHEX() 函数一起使用,并且在使用此函数时,查询此列上的忽略索引。我把我的想法放在这里rathishkumar.in/2017/08/how-to-store-ip-address-in-mysql.html
【解决方案2】:

如果您只想存储 IPv4 地址,则可以将它们存储在 32 位整数字段中。

如果您也想支持 IPv6,那么字符串可能是最易于阅读/使用的方式(尽管从技术上讲,您可以将它们存储在 16 字节的 VARBINARY() 字段中,但尝试生成 SQL 语句以“手动”按 IP 地址选择)

【讨论】:

  • +1:预测 IPv6 使用情况的唯一答案
  • 只是在使用 IPV6 时功能不同( INET6_ATON(ip) )。 IPV4 需要 VARBINARY(4) 而 IPV6 需要 VARBINARY(16) (这当然也适用于 V4 地址)。您可以将 V4 IP (INT) 转换为兼容的格式,如下所示:INET6_ATON(INET_NTOA(ip))
  • INET6_ATON('172.32.x.x') 可以将 IPv4 和 IPv6 地址转换为blob。可以使用INET6_NTOA 将其转换回来。正如@John 所说,不需要做INET6_ATON(INET_NTOA(ipv4))
【解决方案3】:

最重要的是确保该列被索引。这可能会对基于 IP 地址的查询产生巨大影响。

【讨论】:

  • 我的理解是 varchar 上的索引帮助有限。
  • @Josiah 是什么让你这么说?
【解决方案4】:

任何对您来说最容易使用的东西。在您通过分析知道这是一个问题之前,大小或速度问题不是问题。在某些情况下,如果您需要进行部分匹配,字符串可能更容易使用。但作为空间或性能问题,除非您有真正的理由担心,否则不要担心。

【讨论】:

    【解决方案5】:

    也许将整数值直接存储在整数字段中?一个 IP 地址基本上是 4 个“短裤”。

    查看:http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip

    【讨论】:

    • 所以他会将它存储在四个字段中?他们将是字节,不是吗?每次 2^8 或者,他可以将它们转换为十进制数字并存储十进制,虽然这将是一个更大的字段,但它会是一个字段。
    • 一个更合适的白话是说一个IP地址是4个字节。
    • 我明白了要点。布赖恩说概念上一个 int 是由四个短裤组成的。短是一个字节。一个 int 是 4 个字节。如本页其他地方所述,它必须是无符号整数。
    猜你喜欢
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2011-05-29
    相关资源
    最近更新 更多