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

问题描述:

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

SELECT * FROM logins WHERE ip = '1.2.3.4' 

其中ip是一个VARCHAR(15)字段。

有没有更好的方法来做到这一点?

+11

好的,所以你的程序坏掉了,或者根本不能用IPv6 ......叹气。 – Juliano 2010-03-29 23:55:22

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) 
+4

您不会将其存储为“INT”,而是存储为“INT UNSIGNED”。尽管我喜欢使用故意内置的功能。 +1 – pstanton 2010-03-30 00:11:14

+0

谢谢。你知道这是否有一个Python函数? – ensnare 2010-03-30 00:48:01

+0

@ensnare:是的,请查看:http://snipplr.com/view/14807/convert-ip-to-int-and-int-to-ip/。 – 2010-03-30 00:53:34

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

+0

我的理解是varchar上的索引是有限的帮助。 – flickerfly 2016-02-29 17:30:02

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

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

+0

所以他会把它存储在四个领域?他们会是字节,不是?每次2^8 或者,他可以将它们转换为十进制数并存储小数,尽管这将是一个更大的字段,它将是一个字段。 – jcolebrand 2010-03-29 23:55:04

+1

更合适的方言将是IP地址是4个字节。 – 2010-03-29 23:58:30

+0

我明白了。布赖恩的说法是,概念上的一个整数由四个短裤组成。短是一个字节。一个int是4个字节。如本页其他地方所说,它需要是一个unsigned int。 – joe 2016-02-29 23:59:43

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

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

+18

+1:预测IPv6使用的唯一答案 – Juliano 2010-03-30 00:02:42

+3

正当使用IPV6的功能不同(INET6_ATON(ip))。 IPV4需要VARBINARY(4)和IPV6需要VARBINARY(16)(当然也适用于V4地址)。 您可以将V4 IP(INT)转换为兼容格式,如下所示:INET6_ATON(INET_NTOA(ip)) – John 2014-09-24 14:35:18

无论您使用什么最简单的方法。除非您知道这是分析问题,否则大小或速度问题不是问题。在某些情况下,如果需要进行部分匹配,字符串可能更容易处理。但作为空间或性能问题,除非您真的有理由担心它,否则不要担心。