在SQL服务器中,存储IP地址最合适的数据类型是什么?

10 浏览
0 Comments

在SQL服务器中,存储IP地址最合适的数据类型是什么?

在SQL Server中,存储IPv4地址最推荐的数据类型是什么?或者可能已经有人为此创建了一个用户SQL数据类型(.Net程序集)吗?我不需要进行排序。

0
0 Comments

出现的原因:在SQL Server中存储IP地址时,如果需要对其进行排序,可能会遇到困难,除非进行零填充。

解决方法:使用CAST函数和hierarchyid类型来解决IP地址排序的问题。可以在SQL Server 2008中使用以下方法来实现:

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地址转换为hierarchyid类型,并在排序时使用。这样可以正确地按照IP地址的顺序进行排序。

另外,还可以在stackoverflow上找到另一种更简便的从数据库中获取IP地址并排序的方法。链接如下:stackoverflow.com/questions/23092783

0
0 Comments

什么是在SQL服务器中存储IP地址的最合适的数据类型?

在SQL服务器中存储IP地址时,常用的数据类型是varchar(15)。但是,对它们进行排序是非常麻烦的,除非你填充零位。

过去,我也将它们存储为INT。System.Net.IPAddress具有一个GetAddressBytes方法,它将IP地址作为表示IP地址的4个字节的数组返回。您可以使用以下C#代码将IPAddress转换为int...

var ipAsInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);

我之前使用这种方法是因为我需要对重复地址进行大量搜索,并希望索引尽可能小且快速。然后,要将int转换回.net中的IPAddress对象,可以使用BitConverter上的GetBytes方法将int转换为字节数组。将该字节数组传递给以字节数组为参数的IPAddress构造函数,您最终将得到与开始时相同的IPAddress。

var myIp = new IPAddress(BitConverter.GetBytes(ipAsInt));

如果您填充了IP地址,那么使用CHAR(15)更合适。

为什么不使用varchar并忽略零位呢?

用零填充IP地址可能会得到不同的IP地址。010.001.001.100与10.1.1.100不是同一件事。在一个八位字节中前面加零表示该字节是以八进制写入的。存储IP地址的正确方法是解析其各种可能的表示形式,并将其作为二进制值存储(根据它们是IPv4还是IPv6地址,可以是32位或128位)。

值得一提的是,当使用字符串时,IPAddress.Parse可能非常有用。还要注意的是,在.NET 4.0中,微软添加了一个新的函数GetAddressBytes,您就不需要将其转换为字节数组,而是可以使用支持它的构造函数之一进行简单的创建。

关于排序IP地址,在SQL Server 2008中,您可以使用hierarchyid来帮助处理这个问题。

此外,IPAddress构造函数接受一个长整型值(奇怪的是,应该是无符号整型)作为初始化参数,可以参考我的答案:

[stackoverflow.com/questions/1038950#3445015](http://stackoverflow.com/questions/1038950#3445015)

0
0 Comments

在SQL Server中,存储IP地址的最合适的数据类型是什么?这个问题的出现是因为存储IP地址的数据类型会影响存储和查询的效率。目前的讨论中,有两种主要的存储方式,一种是将IP地址存储为二进制格式,另一种是将IP地址存储为字符串格式。

将IP地址存储为二进制格式(binary(4))是最接近其表示的方式,可以方便地进行子网掩码样式的查询。但是,如果需要以文本形式显示IP地址,则需要进行转换。如果以字符串格式存储IP地址,则可以使用SQL Server中的一个不太常用的函数PARSENAME来进行处理。该函数不是专门为IP地址设计的,但非常适合处理IP地址。下面的代码可以返回'14':

SELECT PARSENAME('123.234.23.14', 1)

(从右到左计数)

如果需要,还可以创建用户定义函数(UDF)来处理以点分十进制表示法存储的IP地址,以便进行输入和检索。

另外,如果使用ORM(对象关系映射),也可以很容易地封装这种转换,例如在(N)Hibernate中创建一个UserType。

关于为什么不使用整数来存储IP地址的问题,虽然没有直接讨论性能优势,但是提到了二进制存储方式是最接近数据本身的表示方式。

根据存储和查询的需求,选择适合的数据类型来存储IP地址是非常重要的。

0