在MySQL中存储IP地址的最有效方法
在MySQL中存储和检索IP地址最有效的方法是什么?现在我正在做:在MySQL中存储IP地址的最有效方法,mysql,sql,ip-address,Mysql,Sql,Ip Address,在MySQL中存储和检索IP地址最有效的方法是什么?现在我正在做: SELECT * FROM logins WHERE ip = '1.2.3.4' 其中ip是一个VARCHAR(15)字段 有更好的方法吗?最重要的是确保列被索引。这可能会对基于IP地址的查询产生巨大影响。是否可以将整数值直接存储在整数字段中?IP地址基本上是4个“短路” 检查它:对于,您可能希望将它们存储为int unsigned,并使用and函数从其数值返回IP地址,反之亦然 例如: SELECT INET_ATON('
SELECT * FROM logins WHERE ip = '1.2.3.4'
其中ip是一个VARCHAR(15)
字段
有更好的方法吗?最重要的是确保列被索引。这可能会对基于IP地址的查询产生巨大影响。是否可以将整数值直接存储在整数字段中?IP地址基本上是4个“短路” 检查它:对于,您可能希望将它们存储为
int unsigned
,并使用and函数从其数值返回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()
字段中,但尝试“手动”生成SQL语句以按IP地址进行选择会很烦人)任何您最容易使用的方式。在您通过分析发现问题之前,大小或速度问题不是问题。在某些情况下,如果需要进行部分匹配,字符串可能更容易使用。但作为一个空间或性能问题,除非您有真正的理由担心它,否则不要担心它。所以他会将它存储在四个字段中?它们是字节,不是吗?2^8或者,每次他都可以将它们转换为十进制数并存储十进制数,虽然这是一个较大的字段,但它是一个单独的字段。更合适的说法是IP地址是4字节。我明白了要点。布赖恩说,从概念上讲,一个int是由四条短裤组成的。短是一个字节。整数是4个字节。正如本页其他地方所说,它需要是一个未签名的int。好的,因此您的程序已损坏或无法与IPv6一起工作。。。叹气+1:只有在使用IPV6时,才能预测IPV6的使用情况。功能不同(INET6_ATON(ip))。IPV4需要VARBINARY(4),IPV6需要VARBINARY(16)(当然也适用于V4地址)。您可以将V4 IP(INT)转换为如下兼容格式:INET6_ATON(INET_NTOA(IP))INET6_ATON('172.32.x.x')
可以将IPv4和IPv6地址转换为blob
。可以使用INET6\u NTOA
将其转换回。无需执行@john所述的INET6\u ATON(INET\u NTOA(ipv4))
,您不会将其存储为INT
,而是INT UNSIGNED
。不过,我喜欢使用有目的的内置函数+1谢谢。你知道这是否有python函数吗?关于IPv6呢?对于IPv6和IPv6的IPv4使用函数,我在选择IP地址时得到了NULL,后来我了解了使用INET6\u NTOA和HEX()和UNHEX()函数以提高可读性,并且,在使用此函数时,查询此列上的忽略索引。我把我的想法放在这里,我的理解是varchar上的索引帮助有限。@Josiah你为什么这么说?