Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中存储IP地址的最有效方法_Mysql_Sql_Ip Address - Fatal编程技术网

在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('

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

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你为什么这么说?