在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 怎么样?
对于 IPv6 和 IPv4 使用函数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地址的最有效方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章