Jaki jest najbardziej odpowiedni typ danych do przechowywania adresu IP w SQL server? [duplikat]

To pytanie ma już odpowiedź tutaj:

Jaki powinien być najbardziej zalecany typ danych do przechowywania adresu IPv4 w SQL server?

A może ktoś już stworzył dla niego user SQL data-type (. Net assembly)?

Nie potrzebuję sortowania.

Author: Community, 2009-06-24

15 answers

Przechowywanie adresu IPv4 jako binary(4) jest najprawdziwszy do tego, co reprezentuje i pozwala na łatwe zapytania w stylu maski podsieci. Jednak wymaga konwersji w I Na Zewnątrz, jeśli rzeczywiście jesteś po reprezentacji tekstu. W takim przypadku możesz preferować format ciągów.

Mało używana funkcja SQL Server, która może pomóc, jeśli przechowujesz jako ciąg znaków jest PARSENAME, przy okazji. Nie jest przeznaczony dla adresów IP, ale idealnie do nich pasuje. Wywołanie poniżej powróci '14':

SELECT PARSENAME('123.234.23.14', 1)

(numeracja jest od prawej do lewej).

 61
Author: David M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-15 08:42:41

Zwykle używam varchar (15) dla adresów IPv4 - ale sortowanie ich jest uciążliwe, chyba że padniesz zerami.

Przechowywałam je również jako INT w przeszłości. System.Net.IPAddress mA GetAddressBytes metoda, która zwróci adres IP jako tablicę 4 bajtów reprezentującą adres IP. Możesz użyć poniższego kodu C#, aby przekonwertować IPAddress do an int...

var ipAsInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);

Użyłem tego, ponieważ musiałem dużo szukać fałszywych adresów i chciałem indeksy mają być tak małe i szybkie, jak to możliwe. Następnie wyciągnięcie adresu z int i do IPAddress obiekt w. Net, użyj GetBytes metoda na BitConverter aby uzyskać int jako tablicę bajtów. Przekazać tablicę bajtów do konstruktora dla IPAddress to zajmuje tablicę bajtów, a Ty kończysz z powrotem z IPAddress od tego zacząłeś.

var myIp = new IPAddress(BitConverter.GetBytes(ipAsInt));
 26
Author: Scott Ivey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-08 07:10:55

Odnośnie tego komentarza w zaakceptowanej odpowiedzi

Sortowanie ich jest bólem, chyba że pad zera.

Oto sztuczka dla SQL Server 2008 (z Itzik Ben-Gan w ta książka )

with ip_addresses as
(
SELECT '131.33.2.201' AS ip_address UNION ALL
SELECT '2.12.4.4' AS ip_address UNION ALL
SELECT '131.33.2.202' AS ip_address UNION ALL
SELECT '2.12.4.169' AS ip_address UNION ALL
SELECT '131.107.2.201' AS ip_address 
)
select ip_address
from ip_addresses
ORDER  BY CAST('/' + ip_address + '/' AS hierarchyid)

Zwraca

ip_address
-------------
2.12.4.4
2.12.4.169
131.33.2.201
131.33.2.202
131.107.2.201
 17
Author: Martin Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-09 15:42:37

Jeden z moich ulubionych artykułów mówi o tym, dlaczego nie powinieneś używać wyrażeń regularnych do analizowania adresów IP. Większość z tego, o czym mówią, naprawdę wyjaśnia, dlaczego powinieneś być bardzo ostrożny z tekstowymi reprezentacjami adresów IP. Sugeruję przeczytanie go przed podjęciem decyzji, jakiego typu danych użyć w bazie danych, a także prawdopodobnie do obsługi aplikacji (nawet jeśli artykuł jest napisany o perlu, jest przydatny dla każdego języka).

Myślę, że w koniec 32-bitowy typ danych (lub cztery 8-bitowe typy danych) byłby najlepszym wyborem.

 4
Author: rmeador,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 15:18:41

IPV4? int? czy tinyint x 4?

To naprawdę zależy od tego, czy to tylko przechowywanie i pobieranie, czy będzie to kryterium wyszukiwania dystansowego.

 3
Author: Cade Roux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 15:07:30

Nie zapomnij o IPv6 - potrzebujesz dużo więcej miejsca, jeśli chcesz je przechowywać - 128bits w porównaniu do 32 IPv4.

Wybrałbym bigint, chociaż będziesz potrzebował kodu pomocniczego do przetłumaczenia na wersje przyjazne dla ludzi.

 3
Author: Lee Atkinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 15:16:40

Czytam wiele podobnych pytań i żadna z odpowiedzi w tej nie wspomina o pierwszej odpowiedzi w innych: "dla adresów IPv4, możesz zapisać je jako int unsigned i użyć funkcji INET_ATON() i INET_NTOA (), aby zwrócić adres IP z jego wartości liczbowej i odwrotnie."Myślę, że to jest to, co zamierzam zrobić w moim db, chyba że zdecyduję się użyć funkcji php wymienionych powyżej.

 3
Author: Bobby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-13 03:01:18

Najlepszym sposobem (gdy nie ma potrzeby sortowania i innej kontroli na IP) jestprzechowywanie go jako int , przechowywanie go jako varchar itp. kosztowałby znacznie więcej wydajności niż zwykły niewinny int.

Jest nieruchomość IPAddress.Address ale jest przestarzały, Nie wiem dlaczego, ponieważ jeśli nie potrzebujesz sortowania lub kontroli nad klasami IP, najlepszym sposobem jest przechowywanie go jako unsigned integer (która ma maksymalną wartość 0xffffffff, która jest równa 255.255.255.255 w reprezentacji dziesiętnej.

Również IPAddress klasa ma konstruktor, który przyjmuje długi argument.

I zgodnie z VS debugger visualizer, ta klasa IPAddress sama przechowuje swoją wewnętrzną zmienną jako jedną liczbę (Nie tablicę bajtów).

Czytaj więcej o obejściach przechowywania jednostki w MS SQL Server:

 3
Author: Shimmy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:09

Dla efektywnego przechowywania przestrzeni i gdy wartości mają być przetwarzane (dopasowane lub porównane do zakresu), używam int. Adres IP to tak naprawdę tylko 32-bitowa wartość.

Dla prostego rozwiązania, w którym chcesz tylko zapisać wartość, aby ją wyświetlić, używam varchar(15) do przechowywania reprezentacji ciągu adresu IP.

 2
Author: Guffa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 15:18:27

Udało mi się zrobić cztery kolumny smallint (lub jak tam wolisz smallish integer datatype) - po jednej dla każdego oktetu. Następnie możesz utworzyć widok, który rozwala je razem jako łańcuch znaków (do wyświetlania) lub możesz napisać proste operatory, aby określić, kto wszystko jest w jakiej podsieci itp.

Jest dość szybki (pod warunkiem poprawnego indeksowania), a także pozwala na naprawdę łatwe zapytania(bez manipulacji ciągiem!).

 1
Author: Matt Rogish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 15:15:56

Ponieważ adres IP ma 32 bity w nim, można po prostu użyć LONG Do Przechowywania wartości liczbowej?
Nie byłoby to tak marnotrawne jak używanie VARCHAR, ale wtedy musiałbyś dekodować go z powrotem do adresu IP, zanim go użyjesz, za każdym razem, a opóźnienie i koszty ogólne mogą nie być tego warte.

 0
Author: SqlRyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-02 14:52:38

Prawdopodobnie wybrałbym varchar LUB char.

I ustaw rozmiar na 15.

 0
Author: Simon P Stevens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-02 14:53:14

Najbardziej odpowiednim typem danych do przechowywania adresu IPv4 w bazie MSSQL jest int. Jedynym skrzypkiem jest konwersja go z powrotem do notacji kropkowanej do wyświetlania / sortowania, dlatego polecam utworzyć widok, który automatyzuje to dla Ciebie.

 0
Author: Ian Kemp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-04 20:46:05

Jestem newbie @ php, sql, ale myślę, że najszybszym sposobem na przechowywanie czegoś w SQL db jest przekonwertowanie go do wartości int i zapisanie jako int.

Użyłem funkcji w php-

function ip_convert() {
    $ip = $_SERVER['REMOTE_ADDR'];
    $intip = str_replace(".","0",$ip);
    return $intip;
}
A potem zamieniam wszystkie kropki na zera. Następnie, jeśli trzeba użyć tego ip z sql.. if ($ip == ip_convert ())

Ale to tylko wtedy, gdy używasz PHP.

 -3
Author: Ernests ENkss Zemturis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-22 21:42:57

Cytowanie to :

Przechowuje adresy IP w kolumnie CHAR (15). W zależności od tego, ile danych przechowujesz, może to być dość marnotrawne (dlaczego musimy przechowywać kropki?). I

 -4
Author: joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-22 08:14:25