2014-03-25 6 views
7

Ich möchte sowohl IPv4- als auch IPv6-Adressen in meiner Tabelle speichern können. Wie kann die IP-Adresse eines Benutzers am effizientesten gespeichert werden, unabhängig davon, ob es sich um eine IPv4- oder eine IPv6-Adresse handelt?Speichern Sie sowohl die IPv4- als auch die IPv6-Adresse in einer einzigen Spalte.

Dies wird in einer Produktionsumgebung verwendet werden, so dass zukunftssichere Vorschläge bevorzugt werden.

+0

Eine IPv4-Adresse ist 32 Bit lang. Eine IPv6-Adresse ist 128 Bits lang. Für Storage-Effizienz können IPv6-Adressen in einer 'BINARY (16)' - Spalte gespeichert werden, dies ist jedoch für IPv4-Adressen ineffizient, was in einer 'INT UNSIGNED'-Spalte besser wäre. – AeroX

+1

Zugehörig: http://stackoverflow.com/questions/4444771/how-to-store-a-128-bit-number-in-a-single-column-in-mysql – AeroX

+0

@AeroX, wenn ich 'BINARY (16) ', kann ich die ipadresse speichern, wie zB 192.168.1.2 oder ich muss eine Umwandlung durchführen – user2650277

Antwort

1

Warum muss es eine einzelne Spalte sein? Ein paar Vorschläge ...

Haben Sie 2 Spalten, eine für IPv4, eine für IPv6.

Speichern Sie die IP-Adresse in einer einzigen Spalte und hat eine andere Spalte, die im Grunde eine boolean hält, ob die IPv4-Adresse ist oder nicht ...

+2

Es wäre eine Verschwendung von Ressourcen, da ipaddress nicht so wichtig ist. Ich meine, dass es von der abgerufen werden würde Datenbank nur in seltenen Fällen.Nur eine Version wird benötigt – user2650277

7

ich jede Adresse im IPv6-Format zu speichern, empfehlen würde. Dafür gibt es ein offizielles Mapping: das IPv4-mapped IPv6 address. Es funktioniert wie folgt:

Nehmen Sie zum Beispiel IPv4-Adresse 192.0.2.44
Die Adresse würde ::ffff:192.0.2.44
IPv6 IPv4-mapped sein, die auch als ::ffff:c000:022c geschrieben werden kann (192 dezimal ist c0 hexadezimal usw.)

Sie können Verwenden Sie die inet_pton() Funktion, um solche Adressen zu parsen, und auf meinem lokalen System gibt die inet_ntop() Funktion diese auch im am besten lesbaren Format aus (::ffff:192.0.2.44). So haben Sie nur ein Format in Ihrer Anwendung.

Siehe auch this related answer.

+0

Hat jede IPv4-Adresse ein ipv6-Äquivalent? .Auch werde ich in der Lage sein, diese IPv6-Adressen zurück zu ipv4 zu konvertieren.Sie schlagen den besten Datentyp und die Größe vor, um ipv6 für mysql zu speichern – user2650277

+1

Verwenden Sie ein BINARY (16) für die IPv6-Adresse, und wenn Sie dem Link "verwandte Antwort" folgen, sehen Sie, wie Sie zurück konvertieren. –

Verwandte Themen