Shi*_*mmy 65 sql sql-server types ip-address ipv4
在SQL Server中存储IPv4地址的最佳推荐数据类型是什么?
或者有人已经为它创建了用户SQL数据类型(.Net程序集)?
我不需要排序.
Dav*_*d M 61
将IPv4地址存储为binary(4)最能代表它所代表的内容,并允许轻松进行子网掩码式查询.但是,如果您实际上是在文本表示之后,则需要进行转换.在这种情况下,您可能更喜欢字符串格式.
PARSENAME顺便提一下,如果要以字符串形式存储,可能会有用的SQL Server功能很少.不是为IP地址而设计的,但非常适合它们.以下调用将返回'14':
SELECT PARSENAME('123.234.23.14', 1)
Run Code Online (Sandbox Code Playgroud)
(编号从右到左).
Sco*_*vey 26
我通常只使用varchar(15)作为IPv4地址 - 但除非你填充零,否则对它们进行排序是很痛苦的.
我过去也将它们存储为INT. System.Net.IPAddress有一个GetAddressBytes方法,将IP地址作为表示IP地址的4个字节的数组返回.您可以使用以下C#代码将其转换IPAddress为int...
var ipAsInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);
Run Code Online (Sandbox Code Playgroud)
我曾经使用过它,因为我不得不做很多搜索重复地址,并希望索引尽可能小和快.然后将地址拉回int并进入IPAddress.net中的对象,使用GetBytes方法on BitConverter将int作为字节数组.将该字节数组传递给构造函数,IPAddress这需要一个字节数组,然后以IPAddress最初的数据结束.
var myIp = new IPAddress(BitConverter.GetBytes(ipAsInt));
Run Code Online (Sandbox Code Playgroud)
Mar*_*ith 18
在接受的答案中关于这个评论
除非你填零,否则对它们进行排序是很痛苦的.
这是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)
Run Code Online (Sandbox Code Playgroud)
返回
ip_address
-------------
2.12.4.4
2.12.4.169
131.33.2.201
131.33.2.202
131.107.2.201
Run Code Online (Sandbox Code Playgroud)
为了节省空间的存储以及在处理值(匹配或与范围比较)时,我使用int. IP 地址实际上只是一个 32 位值。
对于您只想存储值以查看它的简单解决方案,我使用 avarchar(15)来存储 IP 地址的字符串表示形式。
| 归档时间: |
|
| 查看次数: |
65786 次 |
| 最近记录: |