在MySQL中存储IP地址的最有效方法[重复]

Posted

技术标签:

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

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

SELECT * FROM logins WHERE ip = '1.2.3.4'

其中 ip 是 VARCHAR(15) 字段。

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

【问题讨论】:

好的,所以你的程序坏了,或者根本不能用 IPv6 运行......叹息。 【参考方案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 个字节。如本页其他地方所述,它必须是无符号整数。

以上是关于在MySQL中存储IP地址的最有效方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL如何有效的存储IP地址

MySQL如何有效的存储IP地址

验证IP地址 - python [重复]

在 Oracle SQL 表中存储 IP 地址 [重复]

什么是ip寻址

将IP存储在数据库中的最佳方法?