在SQL Server中,存储IPv4地址的最推荐数据类型是什么?
或者已经有人为此创建了用户SQL数据类型(.Net程序集)吗?
我不需要排序。
在SQL Server中,存储IPv4地址的最推荐数据类型是什么?
或者已经有人为此创建了用户SQL数据类型(.Net程序集)吗?
我不需要排序。
System.Net.IPAddress
有一个GetAddressBytes
方法,它将以表示IP地址的4个字节的数组形式返回IP地址。您可以使用以下C#代码将IPAddress
转换为int
...var ipAsInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);
我使用这种方法是因为我需要搜索大量重复地址,并希望索引尽可能小且快速。然后,要将地址从int转换回.net中的IPAddress
对象,请使用BitConverter
上的GetBytes
方法将int转换为字节数组。将该字节数组传递给IPAddress
的constructor,该构造函数接受一个字节数组,您最终会得到您开始时的IPAddress
。
var myIp = new IPAddress(BitConverter.GetBytes(ipAsInt));
hierarchyid
来帮助解决此问题。https://dev59.com/iHNA5IYBdhLWcg3wPbSe#3441685 - Martin Smith关于被接受的答案中的这个评论
如果不填充零,排序会很麻烦。
这是一个针对 SQL Server 2008 的技巧(来自 Itzik Ben-Gan 在这本书中)
with ip_addresses as
(
SELECT '131.33.2.201' AS ip_address UNION ALL
SELECT '2.12.4.4' AS ip_address UNION ALL
SELECT '131.33.2.202' AS ip_address UNION ALL
SELECT '2.12.4.169' AS ip_address UNION ALL
SELECT '131.107.2.201' AS ip_address
)
select ip_address
from ip_addresses
ORDER BY CAST('/' + ip_address + '/' AS hierarchyid)
返回
ip_address
-------------
2.12.4.4
2.12.4.169
131.33.2.201
131.33.2.202
131.107.2.201
为了节省空间并且需要处理值(匹配或与范围比较),我使用int
。IP地址实际上只是一个32位的值。
如果您只想简单存储该值以查看它,我使用varchar(15)
来存储IP地址的字符串表示形式。
我在这里看到很多类似的问题,但在这个问题的回复中没有提到其他问题中最常见的答案:“对于IPv4地址,你可能希望将它们存储为无符号整数,并使用INET_ATON()和INET_NTOA()函数从其数值返回IP地址,反之亦然。”我认为这是我要在我的数据库中采用的方法,除非我决定使用上面提到的php函数。
不要忘记IPv6 - 如果需要存储它们,你需要更多的空间 - 128位与IPv4的32位相比。
我会选择bigint,尽管你需要一些辅助代码来将其转换为人类友好的版本。
我最喜欢的文章之一谈到了为什么你不应该使用正则表达式来解析IP地址。他们大多数讲的是为什么你应该非常小心地处理IP地址的文本表示。在决定数据库中使用哪种数据类型以及处理应用程序时,建议您先阅读此文章(即使这篇文章是关于Perl编写的,但对任何语言都有用)。
我认为最终选择32位数据类型(或四个8位数据类型)将是最佳选择。
IPAddress.Address
,但它已过时,我不知道为什么,因为如果您不需要对IP类进行排序或控制,则最佳方法是将其存储为无符号整数(其最大值为0xffffffff
,相当于十进制表示中的255.255.255.255
)。
使用EF Core,您可以使用转换器自动转换为和从IPAddress
转换。int
。 - Shimmy WeitzhandlerIPV4?int?还是tinyint x 4?
这取决于它是仅用于存储和检索还是将成为范围搜索条件。
由于IP地址有32位,你能否使用LONG来存储数值?
这样做不会像使用VARCHAR那样浪费空间,但是你每次使用它之前都必须将其解码回IP地址,这会导致延迟和额外的开销,可能得不偿失。