在 MySQL 中存储和检索 IP 地址最有效的方法是什么:
SELECT * FROM logins WHERE ip = '1.2.3.4'
其中 ip 是 VARCHAR(15)字段。
VARCHAR(15)
还有更好的办法吗?
最重要的事情是确保该列被索引。这可能会对基于 IP 地址的查询产生巨大的影响。
也许直接存储整数值在一个整数字段? 一个 IP 地址基本上是4“短”。
看看 http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip
对于 IPv4地址,您可能希望将它们存储为 int unsigned并使用 INET_ATON()和 INET_NTOA()函数从其数值返回 IP 地址,反之亦然。
int unsigned
INET_ATON()
INET_NTOA()
例如:
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 语句来选择它们,那将是非常烦人的)
VARBINARY()
只要是你最容易处理的就行。尺寸或速度的问题不是一个问题,直到你知道它是一个问题通过分析。在某些情况下,如果需要进行部分匹配,则使用字符串可能更容易。但是,作为一个空间或性能问题,不要担心它,除非您有真正的理由担心它。