在 Microsoft SQL Server 中存储 IP 地址

Posted

技术标签:

【中文标题】在 Microsoft SQL Server 中存储 IP 地址【英文标题】:Storing IP addresses in Microsoft SQL Server 【发布时间】:2011-10-05 03:05:23 【问题描述】:

我知道已经有很多关于这个主题的问题,但我可能还有一些额外的问题。

我想将 IP 地址存储在数据库中(如果可能,单列)。我希望能够存储 IPv4 或 IPv6 地址。我希望能够在检索时区分 IPv4 和 IPv6 地址。

我考虑过的方法:

使用 VARCHAR(45) 以文本格式存储 IP 地址。 IPv4 地址的文本表示的最大长度为 15 个字符。 IPv6 地址的文本表示的最大长度是 39 个字符,尽管我读到它们在代理 IPv4 地址时实际上可以达到 45(不是我很熟悉的东西,所以我可能会离开这里) - 某些软件中的头文件似乎反映了这一点,将 46 指定为 IPv6 地址的最大长度(45 + \0)。格式之间的区别是微不足道的。

将 IP 地址存储在两个 bigint 列中。这比文本格式使用的空间更少。格式之间的区别 - 如果第一列是 0 或 NULL(虽然对性能不利),它是 IPv4 地址,否则是 IPv6?

将 IP 地址存储在唯一标识符列中。 128 位,可以以最紧凑的方式存储两种地址格式(我们在 IPv4 地址上浪费了 96 位,但无论我们做什么都是不可避免的)。这种方式似乎最可取,但给定任何 128 位整数,是否有可能知道该 128 位整数是代表 IPv4 还是 IPv6 地址?

如果可以区分表示为单个 128 位整数的 IPv4 和 IPv6 地址,我宁愿使用第三种方法,除非该解决方案存在任何重大问题。我想我的主要问题是这是否可能,但听到任何关于不同方法(包括我未在此处列出的方法)优缺点的想法也会有所帮助。

另外...如果有必要,结合第三种方法(区分 IPv4 和 IPv6)添加一个位列是否是个好主意?位列实际上是 1 位,还是 8 位?

【问题讨论】:

另见***.com/questions/6640871/… 这能回答你的问题吗? Datatype for storing ip address in SQL Server 【参考方案1】:

我可以将它存储为二进制。 IPv6 地址是 128 位 -> 16 字节长。如果存储 IPv4 地址,则应将其存储在最后 4 个字节处。当您在应用程序中使用此字段时,有许多内置选项可将 IPv6 转换为文本并将文本转换回 IPv6 二进制文件。

在 IPv4 情况下:此地址类型的前 80 位(10 字节)设置为零,接下来的 16 位(2 字节)设置为 1 (0xFF),而其最后 32 位(4 字节)填充IPv4 地址。堆栈实现通常不同,因此您应该在客户端进行转换(从 IPv6 到 IPv4)。这个地址空间是安全的,所以它是为 IPv4 寻址而保留的。

More info 和 more info。

【讨论】:

那么如果一个 128 位整数的前 96 位是 0,那必须原来是一个 IPv4 地址吗?或者也可能是 IPv6 地址? Here is the answer: 此地址类型的前 80 位设置为 0,后 16 位设置为 1,而后 32 位使用 IPv4 地址填充。堆栈实现通常不同,因此您应该在客户端进行转换(从 IPv6 到 IPv4)。这真的很简单,因为您应该使用前 4 个字节来寻址。 @Jake Petroules:“或者也可能是 IPv6 地址?” 没有为 IPv4 地址保留此地址空间。

以上是关于在 Microsoft SQL Server 中存储 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章

标题: Microsoft SQL Server Management Studio

在Microsoft SQL Server中选择随机行

ubuntu下连microsoft sql server解决方案

如何在 Microsoft SQL Server 中“取消堆叠”SQL 中的数据

java.sql.SQLException [Microsoft] [ODBC SQL Server Driver] [SQL Server] 对象名“表名”无效

安装sql server 2008 R2,提示错误:此计算机上安装了 Microsoft Visual Studio 2008 的早期版本。请在安装 SQL Server 2008 前将 Micros