什么是SQL Server中存储的IP地址最合适的数据类型? [重复] 什么是SQL Serve

2019-05-12 22:22发布

这个问题已经在这里有一个答案:

  • 数据类型在SQL Server中存储的IP地址 10个回答

应该是什么在SQL服务器存储IPv4地址的最值得推荐的数据类型?

或者,也许有人已经创造了其用户的SQL数据类型(.NET程序集)?

我不需要排序。

Answer 1:

储存的IPv4地址为binary (4)是最真实的,以所代表的,并可以很方便子网掩码式查询。 然而,这需要转换进出,如果你一个文本表示以后实际上是。 在这种情况下,你可能更喜欢一个字符串格式。

很少使用SQL Server的功能,如果你是存储为一个字符串,这可能有助于为PARSENAME ,顺便说一句。 不是专为IP地址,但完全适合他们。 下面的调用将返回“14”:

SELECT PARSENAME('123.234.23.14', 1)

(编号是从右到左)。



Answer 2:

我通常只使用VARCHAR(15),用于IPv4地址 - 但它们排序是,除非你垫零痛苦。

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

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

我用了,因为我必须做搜索欺骗地址的很多,并希望索引尽可能小和快越好。 然后拉地址返出的int并进入IPAddress在.NET对象,使用GetBytes上方法BitConverter获得INT作为字节数组。 传递字节数组构造的IPAddress ,需要一个字节数组,你最终备份与IPAddress ,你开始。

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


Answer 3:

关于接受的答案这条评论

对它们进行排序除非你垫零痛苦。

下面是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_address
-------------
2.12.4.4
2.12.4.169
131.33.2.201
131.33.2.202
131.107.2.201


Answer 4:

我最喜欢的文章谈到为什么你不应该使用正则表达式来解析IP地址。 他们大多是在谈论是真正解释为什么你应该非常小心的IP地址的文本表示什么。 我建议你决定在你的数据库中使用的数据类型,大概也因为种种处理您的应用程序会做之前阅读它(即使该文章是写关于Perl,它是任何语言很有用)。

我认为在端部的32位的数据类型(或4个8位的数据类型)将是最好的选择。



Answer 5:

IPV4? 诠释? 或TINYINT×4?

这真的取决于它是否只是存储和检索,或者如果它要成为一个范围搜索条件。



Answer 6:

Don't forget about IPv6 - you need a lot more room if you need to store them - 128bits compares to IPv4's 32.

I'd go for bigint, though you will need some helper code to translate to human friendly versions.



Answer 7:

我读了很多关于这里类似的问题,并没有在这一个答复提到在别人一个回答:“对于IPv4地址,您可能希望将其存储为一个int无符号和使用INET_ATON()和INET_NTOA()函数来从它的数值返回的IP地址,反之亦然。” 我想这就是我要与走在我的分贝,除非我决定使用上面提到的PHP函数。



Answer 8:

最好的办法(当不需要分类和对IP地址等控制)是其存储为整型 ,将其存储为varchar等的成本比只是一个简单的无辜INT方式更高的性能。

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

此外IPAddress类具有接受一个long参数的构造函数。

并根据VS调试器可视,即的IPAddress类本身存储其内部变量作为一个数字(未字节数组)。

了解更多关于解决方法存储单元中的MS SQL Server:

  • 在MS SQL 4字节无符号整型?
  • SQL Server的4字节无符号整型


Answer 9:

对于空间高效存储以及当所述值是要被处理(匹配或比较的范围)中,我使用的int 。 IP地址真的只是一个32位值。

对于一个简单的解决方案,你只是想存储的值来查看它,我用一个varchar(15)存储IP地址的字符串表示。



Answer 10:

我已经取得了一些成功使4个SMALLINT(或任何短小的整数数据类型,你喜欢)列 - 每个八位字节。 然后,你可以让它们一起捣毁它们作为一个字符字符串(显示)的图或则你可以写简单的运营商,以确定谁是所有子网等什么

这是相当快的(前提是你做正确的索引)也允许很容易查询(没有字符串操作!)。



Answer 11:

由于IP地址有32位吧,你能只使用一个LONG来存储数值?
它不会是因为空间的浪费使用VARCHAR,但你不得不将其解码回一个IP使用前,每一次,延迟和开销成本可能不值得。



Answer 12:

用于在MSSQL数据库中存储的IPv4地址的最适当的数据类型,是一个int 。 唯一的繁琐位将其转换回点号进行显示/排序,所以我建议你创建一个自动执行此为您的视图。



Answer 13:

我可能有去varcharchar

和大小设置为15。



Answer 14:

引用此 :

在CHAR(15)列存储的IP地址。 取决于你有多少数据存储,这可能是非常浪费的(为什么我们需要存储的点?)。 一世



Answer 15:

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

我在PHP中使用的功能 -

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

然后我就用零代替所有点。 然后,如果我需要使用此IP从SQL ..如果($知识产权== ip_convert())

但是,这只有在使用PHP。



文章来源: What is the most appropriate data type for storing an IP address in SQL server? [duplicate]