2010-07-27 144 views
1

我需要创建一个表来存储黑名单中的IP地址,以防我的博客中出现垃圾邮件。 我想知道:将数据库中的IP地址存储为最佳方式

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

我使用MS SQL 2008数据库

感谢您的时间

+0

[SQL Server中存储的IP地址数据类型]的可能重复(http://stackoverflow.com/questions/1385552/datatype-for-storing-ip-address-in-sql-server) – ChrisF 2010-07-27 10:35:59

回答

2

最简单的事情就是存储一个char(15),假设IPV4。

这是使用最简单的形式,并不需要复杂的转换和计算,除非你是存储在数据量非常大(数百万条记录),性能不应因素。

+0

char(46)到IPV6 https://stackoverflow.com/a/166157/1647238 – 2017-12-06 17:31:35

1

垃圾邮件发送者是不可能保持使用相同的IP地址,所以你会在那场战斗中失败。更好地实施CAPTCHA比试图消除IP或使用连接中的其他数据来“过滤”垃圾邮件制造者更好。这大部分都是通过自动化工具完成的,因此CAPTCHA是最好的路线。

0

一般来说,我认为这将取决于你要触发什么类型的查询。如果查询很简单,基于ipaddress的完整比较,或者ipaddress不是过滤器的一部分,我会说它简单地作为varchar是很好的方法。如果你想用一个复杂的查询进行搜索,例如在一个子网中属于ip地址的行等,那么你可以将ip地址存储为四列中的四个int值。

1

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

3

IP v4地址是4个字节,IP v6地址是16个字节,因此将它们存储为varbinary(16)字段。我从您的问题标签中看到您正在使用.Net,因此您可以使用IPAddress.GetAddressBytes()轻松获得这些字节。如果您使用实体框架或类似的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(); } 
    } 
相关问题