我知道关于这个主题已经有很多问题,但我可能会有一些额外的问题。
我想将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?