Welchen Datentyp soll ich zum Speichern einer IP-Adresse in einem SQL Server wählen?
Wäre es dann durch Auswahl des richtigen Datentyps einfach genug, nach IP-Adresse zu filtern?
sql-server
tsql
sql-server-2005
types
ip-address
Oder Else
quelle
quelle
Antworten:
Die technisch korrekte Art, IPv4 zu speichern, ist binär (4), da dies tatsächlich der Fall ist (nein, nicht einmal ein INT32 / INT (4), da die numerische Textform, die wir alle kennen und lieben (255.255.255.255), gerecht ist die Anzeigekonvertierung seines binären Inhalts).
Wenn Sie dies auf diese Weise tun, möchten Sie, dass Funktionen in und aus dem Textanzeigeformat konvertiert werden:
So konvertieren Sie das Textanzeigeformular in eine Binärdatei:
Und so konvertieren Sie die Binärdatei zurück in die Textanzeigeform:
Hier ist eine Demo, wie man sie benutzt:
Verwenden Sie beim Nachschlagen und Vergleichen immer die Binärform, wenn Sie Ihre Indizes nutzen möchten.
AKTUALISIEREN:
Ich wollte hinzufügen, dass eine Möglichkeit, die inhärenten Leistungsprobleme von skalaren UDFs in SQL Server zu beheben, aber die Code-Wiederverwendung einer Funktion beibehalten soll, darin besteht, stattdessen eine iTVF (Inline-Funktion mit Tabellenwert) zu verwenden. So kann die erste Funktion oben (String zu Binär) als iTVF neu geschrieben werden:
Hier ist es im Beispiel:
Und so würden Sie es in einem INSERT verwenden
quelle
Sie können varchar verwenden. Die Länge von IPv4 ist statisch, die von IPv6 kann jedoch sehr unterschiedlich sein.
Wenn Sie keinen guten Grund haben, es als Binärdatei zu speichern, bleiben Sie bei einem Zeichenfolgentyp (Text).
quelle
Hier ist ein Code zum Konvertieren von IPV4 oder IPv6 im Varchar-Format in Binär (16) und zurück. Dies ist die kleinste Form, die ich mir vorstellen kann. Es sollte gut indizieren und eine relativ einfache Möglichkeit zum Filtern nach Subnetzen bieten. Benötigt SQL Server 2005 oder höher. Ich bin mir nicht sicher, ob es absolut kugelsicher ist. Hoffe das hilft.
quelle
fn_ConvertIpAddressToBinary
. Siehe die Antwort von C.Plock und meine .Da ich beide
IPv4
und behandeln möchteIPv6
, verwende ichVARBINARY(16)
die folgendenSQL CLR
Funktionen, um dietext
IP-Adressdarstellung in Bytes und umgekehrt umzuwandeln :quelle
Benutzer von .NET können die IPAddress-Klasse verwenden, um IPv4 / IPv6-Zeichenfolgen zu analysieren und als zu speichern
VARBINARY(16)
. Kann dieselbe Klasse zum Konvertierenbyte[]
in einen String verwenden. Wenn Sie dasVARBINARY
in SQL konvertieren möchten :quelle
sys.dm_exec_connections
verwendet varchar (48) nach SQL Server 2005 SP1. Klingt gut genug für mich, besonders wenn Sie es im Vergleich zu Ihrem Wert verwenden möchten.Realistisch gesehen werden Sie IPv6 noch eine Weile nicht als Mainstream sehen, daher würde ich die 4 tinyint-Route bevorzugen. Wenn ich das sage, benutze ich varchar (48), weil ich
sys.dm_exec_connections
...Andernfalls. Mark Redmans Antwort erwähnt eine frühere SO-
Debattenfrage.quelle
Danke RBarry. Ich stelle ein IP-Blockzuweisungssystem zusammen und das Speichern als Binärdatei ist der einzige Weg.
Ich speichere die CIDR-Darstellung (Beispiel: 192.168.1.0/24) des IP-Blocks in einem Varchar-Feld und verwende 2 berechnete Felder, um die Binärform von Anfang und Ende des Blocks zu speichern. Von dort aus kann ich schnelle Abfragen ausführen, um festzustellen, ob ein bestimmter Block bereits zugewiesen wurde oder frei zugewiesen werden kann.
Ich habe Ihre Funktion geändert, um die End-IP-Adresse wie folgt zu berechnen:
quelle
Normalerweise verwende ich eine einfache alte VARCHAR-Filterung für eine IPAddress.
Wenn Sie nach IP-Adressbereichen filtern möchten, würde ich diese in vier Ganzzahlen aufteilen.
quelle
Ich mag die Funktionen von SandRock. Aber ich habe einen Fehler im Code von dbo.fn_ConvertIpAddressToBinary gefunden . Der eingehende Parameter von @ipAddress VARCHAR (39) ist zu klein, wenn Sie das @delim darauf konzentrieren.
Sie können es auf 40 erhöhen. Oder besser noch eine neue Variable verwenden, die größer ist, und diese intern verwenden. Auf diese Weise verlieren Sie nicht das letzte Paar bei großen Zahlen.
quelle
Die folgende Antwort basiert auf Antworten von M. Turnhout und Jerry Birchler auf diese Frage, jedoch mit den folgenden Verbesserungen:
sys.fn_varbintohexsubstring
,fn_varbintohexstr
) wurde durchCONVERT()
for ersetzt binäre Stile ersetztCAST('' as xml).value('xs:hexBinary())
) wurde durchCONVERT()
for ersetzt Binärstilefn_ConvertIpAddressToBinary
von behoben (wie von C.Plock hervorgehoben )Der Code wurde in SQL Server 2014 und SQL Server 2016 getestet (siehe Testfälle am Ende).
IPAddressVarbinaryToString
Konvertiert 4-Byte-Werte in IPV4- und 16-Byte-Werte in IPV6- Zeichenfolgendarstellungen. Beachten Sie, dass diese Funktion Adressen nicht verkürzt.
Testfälle:
IPAddressStringToVarbinary
Konvertiert IPV4- und IPV6- Zeichenfolgendarstellungen in 4-Byte- bzw. 16-Byte-Binärwerte. Beachten Sie, dass diese Funktion die meisten (alle häufig verwendeten) Kurzadressdarstellungen analysieren kann (z. B. 127 ... 1 und 2001: db8 :: 1319: 370: 7348). Um die Thins-Funktion zu zwingen, immer 16-Byte-Binärwerte zurückzugeben, kommentieren Sie die Verkettung der führenden Nullen am Ende der Funktion aus.
Testfälle
Gültige Fälle
Ungültige Fälle
quelle
Ich benutze
varchar(15)
bisher alles funktioniert für mich. Einfügen, Aktualisieren, Auswählen. Ich habe gerade eine App mit IP-Adressen gestartet, obwohl ich noch nicht viel Entwicklungsarbeit geleistet habe.Hier ist die select-Anweisung:
quelle