Sven Rautenberg: [MySQL] 128-Bit-Werte (IPv6) in DB speichern

Beitrag lesen

Moin!

möchte ich IPv6-Adressen (128Bit) über Perl so in einer MySQl-Datenbank speichern, dass ich diese dann auch per Vergleich suchen kann.

Die Frage des Speicherns ist abhängig von der Frage des wiederfindens.

Wiederfinden wirst du diese IP sicherlich auch, wenn du sie einfach als Text in die DB packst. Das ist aber nicht unbedingt der erwartete Usecase bei IPv6. Exact dieselbe IP wiederfinden willst und wirst du nur, wenn du entweder mit Servern zu tun hast, oder mit Clients ohne Privacy Extensions.

In allen anderen Fällen sind die letzten 64 Bit der IP nicht konstant.

Also sagen wir ich haben die v6IP 2001:db8::1 und ich möchte diese einem Datensatz einer Tabelle, die verschiedene Netzbereiche mit Start- und Endadresse enthält, zuordnen.

Für Netzbereichs-Zuordnung sind nur die ersten 64 Bit einer IPv6 zuständig. Und für 64 Bit gibts in MySQL eine Datenstruktur. Wenn dein Hauptaugenmerk also auf diesen ersten 64 Bit liegt, dann teile die IP in ihrer Bitdarstellung in zwei Teile und speichere sie in der Langform.

Die spätere Anweisung sollte also lauten:
Suche mir einen Datensatz, dessen Startbereich <= 2001:db8::1 und dessen Zielbereich >= 2001:db8::1 ist.

Solch eine Anweisung kann technisch zwar denkbar sein, aus Sicht von IPv6 ist sie jedoch eher unsinnig. Entweder 2001:db8::1 ist ein Server - dann ist die IP konstant. Oder es ist kein Server - dann können 2001:db8::DDEE:1122:2345:9071 und 2001:db8::2 dieselbe Maschine sein, sogar zur gleichen Zeit.

P.S. Das "Auflängen" der IPs auf einen 32-stelligen Hexstring ist kein Problem, ich weiß nur nicht in welcher Form ich sie in die DB bekommen (bzw. später auch die Abfragen schreibe).

Entweder du speicherst die IP in der definierten Langform, immer alle 128 Bit. Für Suchen mit Bitmasken ist das vermutlich besser. Oder du speicherst sie immer in der kürzestmöglichen Form als Text - den Input dabei einmal auf Langform und dann auf Kurzform bringen, damit nicht äquivalente Schreibweisen wie 2001:db8:: und 2001:0db8:: unterschiedlich aussehen.

- Sven Rautenberg