首页 文章

在Microsoft SQL Server中存储IP地址

提问于
浏览
6

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

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

我考虑过的方法:

  • 使用VARCHAR(45)以文本格式存储IP地址 . IPv4地址的文本表示的最大长度为 15 个字符 . IPv6地址的文本表示的最大长度是 39 个字符,虽然我读到它们实际上可以达到 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 回答

  • 3

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

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

    More infomore info .

相关问题