2010-07-27 141 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(); } 
    } 
相關問題