以最佳方式在数据库中存储IP地址

时间:2010-07-27 10:34:35

标签: .net database tsql

我需要创建一个表来存储黑名单的IP地址,以防我的博客中的垃圾邮件发送者。 我想知道:

  • 存储IP地址的最佳数据类型是什么。
  • 我可以在此表中列出您认为对垃圾邮件发送者有用的其他字段。

我使用MS SQL 2008 DB

感谢您的时间

6 个答案:

答案 0 :(得分:6)

答案 1 :(得分:4)

IP v4地址是4个字节,IP v6地址是16个字节,因此将它们存储为varbinary(16)字段。我从您的问号标签中看到您正在使用.Net,因此您可以使用IPAddress.GetAddressBytes()轻松获取这些字节。如果您使用的是Entity Framework或类似的ORM,以下代码将对您有用。

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Net;

    [Required, MinLength(4), MaxLength(16)]
    public byte[] IPAddressBytes { get; set; }

    [NotMapped]
    public IPAddress IPAddress
    {
        get { return new IPAddress(IPAddressBytes); }
        set { IPAddressBytes = value.GetAddressBytes(); }
    }

答案 2 :(得分:2)

最简单的方法是存储char(15),假设为IPV4。

这是最简单的使用形式,不需要复杂的转换和计算,除非您存储大量数据(数百万条记录),否则性能不应该考虑在内。

答案 3 :(得分:1)

垃圾邮件发送者不太可能继续使用相同的IP地址,因此您将在那场战斗中失败。最好实现CAPTCHA而不是尝试消除IP或使用连接中的其他数据来“过滤”垃圾邮件发送者。其中大部分是通过自动化工具完成的,因此CAPTCHA是最佳途径。

答案 4 :(得分:1)

以最易于使用的形式存储。因此,如果您的博客软件将IP地址作为字符串提供给您,请将其存储为字符串。如果软件将传入的IP地址作为无符号整数提供,则以这种方式存储它。这将使您不必将IP转换为每个传入连接的可用形式。

答案 5 :(得分:0)

一般来说,我认为这取决于您要触发的查询类型。如果查询很简单,基于ipaddress的完整比较或ipaddress不是过滤器的一部分,我会说它只是因为varchar是好方法。如果要搜索复杂查询(例如属于一个子网中的IP地址的行等),则可以将ipaddress存储为四列中的四个int值。