我需要创建一个表来存储黑名单中的IP地址,以防我的博客中出现垃圾邮件。 我想知道:将数据库中的IP地址存储为最佳方式
- 什么是最好的数据类型来存储IP地址。
- 我可以在此表中列出您认为可能对垃圾邮件发送者有用的其他字段。
我使用MS SQL 2008数据库
感谢您的时间
我需要创建一个表来存储黑名单中的IP地址,以防我的博客中出现垃圾邮件。 我想知道:将数据库中的IP地址存储为最佳方式
我使用MS SQL 2008数据库
感谢您的时间
最简单的事情就是存储一个char(15)
,假设IPV4。
这是使用最简单的形式,并不需要复杂的转换和计算,除非你是存储在数据量非常大(数百万条记录),性能不应因素。
char(46)到IPV6 https://stackoverflow.com/a/166157/1647238 – 2017-12-06 17:31:35
垃圾邮件发送者是不可能保持使用相同的IP地址,所以你会在那场战斗中失败。更好地实施CAPTCHA比试图消除IP或使用连接中的其他数据来“过滤”垃圾邮件制造者更好。这大部分都是通过自动化工具完成的,因此CAPTCHA是最好的路线。
一般来说,我认为这将取决于你要触发什么类型的查询。如果查询很简单,基于ipaddress的完整比较,或者ipaddress不是过滤器的一部分,我会说它简单地作为varchar是很好的方法。如果你想用一个复杂的查询进行搜索,例如在一个子网中属于ip地址的行等,那么你可以将ip地址存储为四列中的四个int值。
以最易于使用的形式存储它。因此,如果您的博客软件将您的IP地址作为字符串提供给您,请将其存储为字符串。如果软件将传入的IP地址作为无符号整数提供给您,请以此方式进行存储。这将使您无需为每个传入连接将IP转换为可用形式。
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(); }
}
[SQL Server中存储的IP地址数据类型]的可能重复(http://stackoverflow.com/questions/1385552/datatype-for-storing-ip-address-in-sql-server) – ChrisF 2010-07-27 10:35:59