Frage

Wie mache ich das?

Derzeit wird IPv6 nicht verwendet, aber ich muss die Anwendung so entwerfen, dass sie IPv6-fähig macht. Es ist erforderlich, IP -Adressen und CIDR -Blöcke (auch BGP NLRI, aber dies ist eine andere Geschichte) in einer MySQL -Datenbank zu speichern. Ich habe immer ein int für IPv4 + einen Tinyint für Masklen verwendet, aber IPv6 ist 128 Bit.

Welcher Ansatz ist dafür am besten? 2xBIGINT? CHAR(16) Für binäre Lagerung? CHAR(39) Für Textspeicher? 8xSMALLINT in einer dedizierten Tabelle?

Was würdest du empfehlen?

War es hilfreich?

Lösung

Ich bin mir nicht sicher, was das ist Rechts Antwort auf MySQL, da es noch nicht die IPv6 -Adressformate nativ unterstützt (obwohl ", obwohl"WL#798: MySQL IPv6 Support"Schlägt vor, dass es in MySQL V6.0 sein würde, die aktuelle Dokumentation stützt das nicht).

Von denen, die Sie jedoch vorgeschlagen haben, würde ich vorschlagen, 2 * Bigint zu gehen, aber stellen Sie sicher, dass sie nicht signiert sind. Es gibt eine Art natürliche Aufteilung an der /64 -Adressgrenze in IPv6 (da A /64 die kleinste NetBlock -Größe ist), die gut damit übereinstimmt.

Andere Tipps

Beachten Sie, dass die maximale Länge einer IPv6 -Adresse, einschließlich der Zielfernrohrkennung, 46 Bytes beträgt, wie von INET6_ADdrstrlen in Standard -C -Headern definiert. Für die Internetnutzung sollten Sie in der Lage sein, die zu ignorieren Zonenkennung (%10, #eth0 usw.), aber wissen Sie einfach, wann getAddrinfo Gibt ein längeres Ergebnis als erwartet zurück.

Wenn Sie sich in Richtung Char (16) lehnen, verwenden Sie stattdessen auf jeden Fall Binärdatei (16). Binär (n) hat kein Konzept der Zusammenstellung oder des Charakters (oder besser gesagt, es ist ein Zeichen (n) mit einer Zeichenierung/Zusammenfassung von "Binär"). Die Standardeinstellung für char in MySQL ist latein1_swedish_ci, was bedeutet, dass es in der Fall-unempfindlichen Sortierung und Vergleiche für Byte-Werte versucht, die in Latein1 gültige Codepunkte sind, die Ihnen alle Arten von unerwarteten Problemen verursachen.

Eine weitere Option ist die Verwendung von Dezimal (39, 0) Nulle -Nulle -Unsigned, nicht ganz so effizient wie zwei Bigints (Decimal verwendet 4 Bytes pro neun Ziffern in aktuellen Versionen von MySQL), ermöglicht Ihnen jedoch, alles in einer Spalte zu halten und drucken schön raus.

Ich würde das vollständige 39-Charakter-Standard "Standard" gedrucktes Format entscheiden:-

"2001:0db8:85a3:0000:0000:8a2e:0370:7334"

40 mit einem Null -Terminator.

Dies ist das Format, das von den *Nix -Befehlszeilen -Tools verwendet wird, und im Format ist eine IPv6 -Adresse normal (?) In der angegebenen IPv6 -Adresse.

Wird die IP -Adresse von einem Programm verwendet, für das Binärer sinnvoll ist? Oder würden Sie besser dran sein, eine Textdarstellung zu speichern? Mit IPv6 verwenden Sie die Adresse im Allgemeinen weniger und verwenden mit größerer Wahrscheinlichkeit Hostnamen. Ob dies relevant ist, hängt zum Teil von der Anwendung ab. Char (16) wäre eine schlechte Wahl; Char ist für Charakterdaten und mögen keine großen Streams von Zero -Bytes, die in IPv6 -Adressen vorherrschen. 2 x Bigint wäre unangenehm-zwei Felder, die wirklich eins sind (und der Wert ist der Wert, der Big-Endian oder Little-Endian speichert?). Ich hatte einen Binärtyp mit fester Größe verwendet oder wenn das nicht verfügbar ist, habe ich einen Blob -Typ.

Ich arbeite mit einem Projekt mit dem längsten Präfix -Matching, daher trenne ich die Adresse in 4 Ganzzahlen für IPv4 -Adressen. Es funktioniert gut. Ich würde das auf IPv6 -Adressen erweitern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top