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

什么应该是在SQL Server中存储IPv4地址最推荐的数据types?

或者也许有人已经为它创build了一个用户SQL数据types(.Net程序集)?

我不需要sorting。

将IPv4地址存储为binary (4)对于所代表的内容是真实的,并且允许简单的子网掩码式查询。 但是,如果实际上是在文本表示之后,则需要进行转换。 在这种情况下,你可能更喜欢string格式。

顺便说一句,如果你存储为一个string,可能会有所帮助的一点PARSENAME SQL Server函数是PARSENAME 。 不是为IP地址而devise的,但非常适合他们。 下面的电话将返回“14”:

 SELECT PARSENAME('123.234.23.14', 1) 

(编号是从右到左)。

我通常只使用varchar(15)作为IPv4地址 – 但是除非你填零,否则sorting它们是一件痛苦的事情。

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

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

我曾经使用过,因为我不得不做大量的search地址,并希望索引尽可能的小而快。 然后,将地址从int中取出并放入.net中的IPAddress对象,使用BitConverter上的GetBytes方法将int作为字节数组。 将该字节数组传递给IPAddress的构造函数 ,该构造函数接受一个字节数组,然后使用您启动的IPAddress备份。

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

关于这个评论在接受的答案

排除它们是一个痛苦,除非你填零。

这是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 

IPV4? 诠释? 或者tinyint x 4?

这实际上取决于它是否只是存储和检索,或者它是否是一个远程search条件。

不要忘了IPv6 – 如果你需要存储它们,你需要更多的空间–128位和IPv4的32位相比。

我会去bigint,虽然你会需要一些帮手代码来翻译为人性化的版本。

我最喜欢的一篇文章谈到了为什么你不应该使用正则expression式来parsingIP地址。 他们所谈论的大部分内容都是在解释为什么你应该非常小心地使用IP地址的文本表示。 我build议你在决定在你的数据库中使用什么样的数据types之前,先阅读一下它,也许还要处理你的应用程序将要做的任何事(即使这篇文章是关于Perl的,对任何语言都是有用的)。

我认为最后一个32位数据types(或四个8位数据types)将是最好的select。

我在这里读了很多类似的问题,在这个答复中没有一个提到其他人的头号答案:“对于IPv4地址,你可能想要将它们存储为一个int无符号的,并使用INET_ATON()和INET_NTOA()函数从其数值返回IP地址,反之亦然。“ 我认为这是我要去我的分贝,除非我决定使用上面提到的PHPfunction。

最好的方法(当不需要对IP进行sorting和其他控制时) 将其存储为int ,将其存储为varchar等将花费更多的性能,而不仅仅是简单的无辜int。

有一个属性IPAddress.Address但它已经过时,我不知道为什么,因为如果你不需要sorting或控制IP类,最好的方法是将其存储为无符号整数(最大值为0xffffffff等于十进制表示中的255.255.255.255

此外IPAddress类有一个构造函数接受一个长参数。

根据VSdebugging器可视化器,IPAddress类本身将其内部variables存储为一个数字(而不是字节数组)。

详细了解在MS SQL Server中存储单元的解决方法:

  • ms sql中有4个字节的unsigned int?
  • Sql服务器4字节无符号整数

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

对于一个简单的解决scheme,只需要存储值来查看它,我使用varchar(15)来存储IP地址的string表示forms。

我做了四个smallint(或者你喜欢的小整数数据types)列 – 每个八位字节一个。 然后,你可以创build一个视图,把它们作为一个string(用于显示)一起粉碎,或者你可以编写简单的运算符来确定谁在哪个子网等等。

这是相当快(只要你做适当的索引),也允许很容易查询(没有string操作!)。

由于IP地址有32位,你可以用一个LONG来存储数值吗?
这不会像使用VARCHAR那样浪费空间,但是在每次使用之前,必须先将其解码为IP,并且延迟和开销可能不值得。

我可能会去与varcharchar

并将大小设置为15。

用于在MSSQL数据库中存储IPv4地址的最合适的数据types是int 。 唯一的烦人的一点是将其转换回显示/sorting的虚线符号,因此我build议您创build一个视图,为您自动执行此操作。

我是新手@PHP,SQL,但我认为最快的方式来存储在SQL数据库中的东西是将其转换为int值并保存为int。

我在php中使用函数 –

 function ip_convert() { $ip = $_SERVER['REMOTE_ADDR']; $intip = str_replace(".","0",$ip); return $intip; } 

然后我用零replace所有的点。 那么如果我需要使用这个IP从SQL ..如果($ ip == ip_convert())

但是,这只有当你使用PHP。

引用这个 :

将IP地址存储在CHAR(15)列中。 根据您存储的数据量,这可能是相当浪费的(为什么我们需要存储点?)。 一世