Jaki typ danych wybrać do przechowywania adresu IP na serwerze SQL?
Czy wybranie odpowiedniego typu danych byłoby wtedy wystarczająco łatwe do filtrowania według adresu IP?
Jaki typ danych wybrać do przechowywania adresu IP na serwerze SQL?
Czy wybranie odpowiedniego typu danych byłoby wtedy wystarczająco łatwe do filtrowania według adresu IP?
Odpowiedzi:
Technicznie poprawny sposób przechowywania IPv4 jest binarny (4), ponieważ tak właśnie jest (nie, nawet INT32 / INT (4), numeryczna forma tekstowa, którą wszyscy znamy i kochamy (255.255.255.255) jest po prostu konwersja wyświetlania jego zawartości binarnej).
Jeśli zrobisz to w ten sposób, będziesz chciał, aby funkcje konwertowały do iz formatu wyświetlania tekstowego:
Oto jak przekonwertować tekstowy formularz wyświetlania na binarny:
A oto jak przekonwertować plik binarny z powrotem na tekstową formę wyświetlania:
Oto demonstracja, jak ich używać:
Wreszcie, podczas wyszukiwania i porównywania, zawsze używaj formy binarnej, jeśli chcesz mieć możliwość wykorzystania swoich indeksów.
AKTUALIZACJA:
Chciałem dodać, że jednym ze sposobów rozwiązania nieodłącznych problemów z wydajnością skalarnych funkcji UDF w SQL Server, ale nadal zachowując możliwość ponownego wykorzystania kodu funkcji, jest użycie iTVF (wbudowanej funkcji wycenianej w tabeli). Oto, jak pierwszą powyższą funkcję (ciąg do binarnej) można ponownie zapisać jako iTVF:
Oto przykład:
A oto jak użyłbyś tego w INSERT
źródło
Możesz użyć varchar. Długość IPv4 jest statyczna, ale IPv6 może być bardzo zmienna.
Jeśli nie masz dobrego powodu, aby przechowywać go jako plik binarny, trzymaj się typu string (tekstowego).
źródło
Oto kod do konwersji IPV4 lub IPv6 w formacie varchar na binarny (16) iz powrotem. To najmniejsza forma, jaką mogłem wymyślić. Powinien dobrze indeksować i zapewniać stosunkowo łatwy sposób filtrowania w podsieciach. Wymaga SQL Server 2005 lub nowszego. Nie jestem pewien, czy jest całkowicie kuloodporny. Mam nadzieję że to pomoże.
źródło
fn_ConvertIpAddressToBinary
. Zobacz odpowiedź C.Plock i moją .Ponieważ chcę obsługiwać oba
IPv4
iIPv6
, używamVARBINARY(16)
następującychSQL CLR
funkcji do konwersjitext
prezentacji adresu IP na bajty i na odwrót:źródło
Użytkownicy korzystający z platformy .NET mogą użyć klasy IPAddress do przeanalizowania ciągu IPv4 / IPv6 i zapisać go jako plik
VARBINARY(16)
. Może użyć tej samej klasy do konwersjibyte[]
na ciąg. Jeśli chcesz przekonwertowaćVARBINARY
w SQL:źródło
sys.dm_exec_connections
używa varchar (48) po SQL Server 2005 SP1. Brzmi dla mnie wystarczająco dobrze, zwłaszcza jeśli chcesz go użyć w porównaniu do swojej wartości.Realistycznie rzecz biorąc, jeszcze przez jakiś czas nie zobaczysz IPv6 jako głównego nurtu, więc wolałbym trasę 4 tinyint. Mówiąc to, używam varchar (48), ponieważ muszę go używać
sys.dm_exec_connections
...Inaczej. Odpowiedź Marka Redmana wspomina o poprzednim pytaniu z
debatySO .źródło
Dzięki RBarry. Składam system alokacji bloków IP i przechowywanie jako binarne to jedyna droga.
Przechowuję reprezentację CIDR (np .: 192.168.1.0/24) bloku IP w polu varchar i używam 2 pól obliczeniowych do przechowywania postaci binarnej początku i końca bloku. Stamtąd mogę uruchamiać szybkie zapytania, aby sprawdzić, czy dany blok został już przydzielony lub czy można go przypisać.
Zmodyfikowałem twoją funkcję, aby obliczyć końcowy adres IP w następujący sposób:
źródło
Zwykle używam zwykłego starego filtrowania VARCHAR, aby adres IP działał dobrze.
Jeśli chcesz filtrować według zakresów adresów IP, podzielę go na cztery liczby całkowite.
źródło
Lubię funkcje SandRock. Ale znalazłem błąd w kodzie dbo.fn_ConvertIpAddressToBinary . Przychodzący parametr @ipAddress VARCHAR (39) jest zbyt mały, gdy łączysz z nim @delim.
Możesz zwiększyć ją do 40. Lub jeszcze lepiej użyj nowej zmiennej, która jest większa i użyj jej wewnętrznie. W ten sposób nie stracisz ostatniej pary na dużych liczbach.
źródło
Poniższa odpowiedź jest oparta na odpowiedziach M. Turnhouta i Jerry'ego Birchlera na to pytanie, ale z następującymi ulepszeniami:
sys.fn_varbintohexsubstring
,fn_varbintohexstr
) naCONVERT()
for stylów binarnychCAST('' as xml).value('xs:hexBinary())
)CONVERT()
na stylów binarnychfn_ConvertIpAddressToBinary
(jak wskazał C.Plock )Kod został przetestowany w SQL Server 2014 i SQL Server 2016 (zobacz przykłady testowe na końcu)
IPAddressVarbinaryToString
Konwertuje 4-bajtowe wartości na IPV4 i 16-bajtowe na reprezentacje łańcuchowe IPV6 . Zauważ, że ta funkcja nie skraca adresów.
Przypadki testowe:
IPAddressStringToVarbinary
Konwertuje reprezentacje łańcuchów IPV4 i IPV6 na odpowiednio 4-bajtowe i 16-bajtowe wartości binarne. Zauważ, że ta funkcja jest w stanie przeanalizować większość (wszystkie powszechnie używane) skrótowych reprezentacji adresu (np. 127 ... 1 i 2001: db8 :: 1319: 370: 7348). Aby wymusić na funkcji thins, aby zawsze zwracała 16-bajtowe wartości binarne, odkomentowanie prowadzące do konkatenacji zera na końcu funkcji.
Przypadki testowe
Prawidłowe przypadki
Nieprawidłowe przypadki
źródło
Używam do
varchar(15)
tej pory wszystko działa dla mnie. Wstaw, Aktualizuj, Wybierz. Właśnie uruchomiłem aplikację, która ma adresy IP, chociaż nie wykonałem jeszcze zbyt wielu prac programistycznych.Oto instrukcja select:
źródło