我需要創建一個表來存儲黑名單中的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