我需要创建一个表来存储黑名单的IP地址,以防我的博客中的垃圾邮件发送者。 我想知道:
我使用MS SQL 2008 DB
感谢您的时间
答案 0 :(得分:6)
“在四个tinyint列中发现。” http://web.archive.org/web/20150511204915/http://sqlserver2000.databases.aspfaq.com/how-should-i-store-an-ip-address-in-sql-server.html
答案 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值。