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

时间:2010-03-29 23:52:20

标签: mysql sql ip-address

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

SELECT * FROM logins WHERE ip = '1.2.3.4'

其中ip是VARCHAR(15)字段。

有更好的方法吗?

5 个答案:

答案 0 :(得分:105)

对于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)

答案 1 :(得分:54)

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

如果你也想支持IPv6,那么字符串可能是最易于阅读/使用的方式(虽然你可以在技术上将它们存储在一个16字节的VARBINARY()字段中,但它会很烦人尝试生成SQL语句以“手动”通过IP地址进行选择

答案 2 :(得分:4)

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

答案 3 :(得分:2)

与您合作最简单的事情。在您通过性能分析确定问题之前,大小或速度问题不是问题。在某些情况下,如果需要进行部分匹配,字符串可能更容易使用。但是作为一个空间或性能问题,除非你真的有理由担心,否则不要担心它。

答案 4 :(得分:1)

可能直接将整数值存储在整数字段中吗? IP地址基本上是4“短路”。

检查出来:http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip