在MySQL中存储IP地址最有效的方法
什么是在MySQL中存储和检索IP地址的最有效的方法? 现在我正在做:
SELECT * FROM logins WHERE ip = '1.2.3.4'
其中ip是一个VARCHAR(15)
字段。
有一个更好的方法吗?
对于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,那么一个string可能是最易于阅读/使用的方式(尽pipe你可以在技术上将它们存储在一个16字节的VARBINARY()
字段中,但是试图生成SQL语句手动selectIP地址)
最重要的是确保列索引。 这可能会对基于IP地址的查询产生巨大的影响。
也许存储整数值直接在一个整数字段? 一个IP地址基本上是4“短裤”。
检查出来: http : //en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip
无论是最简单的工作。 直到你知道这是一个问题的分析,大小或速度问题不是一个问题。 在某些情况下,如果需要进行部分匹配,string可能更容易处理。 但作为一个空间或性能问题,不要担心它,除非你真的有理由担心它。