在 MySQL 中存储 IP 地址的最有效方法

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

SELECT * FROM logins WHERE ip = '1.2.3.4'

其中 ip 是 VARCHAR(15)字段。

还有更好的办法吗?

62786 次浏览

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

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

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

对于 IPv4地址,您可能希望将它们存储为 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)

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

如果你也想支持 IPv6,那么字符串可能是最容易阅读/使用的方式(尽管从技术上来说你可以将它们存储在16字节的 VARBINARY()字段中,但是如果你试图通过“手动”的 IP 地址来生成 SQL 语句来选择它们,那将是非常烦人的)

只要是你最容易处理的就行。尺寸或速度的问题不是一个问题,直到你知道它是一个问题通过分析。在某些情况下,如果需要进行部分匹配,则使用字符串可能更容易。但是,作为一个空间或性能问题,不要担心它,除非您有真正的理由担心它。