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

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)

(编号从右到左).

  • 如果需要,您还可以创建UDF以使用点分十进制表示法处理这些数据...可能同时用于输入和检索. (2认同)

Sco*_*vey 26

我通常只使用varchar(15)作为IPv4地址 - 但除非你填充零,否则对它们进行排序是很痛苦的.

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

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)

  • 用零填充IP地址可以使其成为不同的IP地址.010.001.001.100与10.1.1.100不同.以八位字节为前的值表示该八位字节以八进制写入.存储IP地址的正确方法(tm)是解析它们各种可能的表示并将它们存储为二进制值(32位或128位,具体取决于它们是IPv4还是IPv6地址). (11认同)
  • 如果你填充ip,使用CHAR(15)会更有意义 (4认同)

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)


Guf*_*ffa 7

为了节省空间的存储以及在处理值(匹配或与范围比较)时,我使用int. IP 地址实际上只是一个 32 位值。

对于您只想存储值以查看它的简单解决方案,我使用 avarchar(15)来存储 IP 地址的字符串表示形式。