在Microsoft SQL Server中存储IP地址

时间:2011-07-14 07:55:37

标签: sql-server ip-address

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

我想将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地址存储在uniqueidentifier列中。 128位,可以以最紧凑的方式存储两种地址格式(我们在IPv4地址上浪费了96位,但无论我们做什么,这都是不可避免的)。这种方式似乎是最优选的,但是给定任何128位整数,是否可以知道该128位整数是代表IPv4还是IPv6地址?

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

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

1 个答案:

答案 0 :(得分:3)

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

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

More infomore info