2009-07-02 7 views
204

Mögliche Duplizieren:
Maximum length of the textual representation of an IPv6 address?Max Länge für die Client-IP-Adresse

Was würden Sie als die maximale Größe für eine Datenbankspalte empfehlen Speichern von Client-IP-Adressen? Ich habe es jetzt auf 16 gesetzt, aber könnte ich eine IP-Adresse bekommen, die länger ist als die mit IPv6 usw.? gibt es 8 Gruppen zu je vier hexadezimale Ziffern

+0

Es ist bereits hier abgedeckt. Überprüfen Sie http://StackOverflow.com/Questions/1038950/what-is-be--the-most-appropriate-Data-type-for-storing-an-ip-address-in-sql-server – Arnkrishn

+4

Eigentlich ist dieser Beitrag nicht sehr hilfreich. Wir verwenden nicht Sql Server und die Antworten auf diesen Beitrag waren knapp und auf den Punkt, genau das, was ich suchte. –

+7

@Andriyev dieser Beitrag bezieht sich nur auf IPv4. –

Antwort

194

Für IPv4 können Sie mit dem Speichern der 4 rohen Bytes der IP-Adresse erhalten (jede der Zahlen zwischen den Perioden in einer IP-Adresse sind 0-255, d. H. Ein Byte). Aber dann müssten Sie das Ein- und Aussteigen aus der Datenbank übersetzen, und das ist unordentlich.

IPv6-Adressen sind 128 Bit (im Gegensatz zu 32 Bit von IPv4-Adressen). Sie werden normalerweise als 8 Gruppen von 4 Hexadezimalziffern geschrieben, die durch Doppelpunkte getrennt sind: 2001:0db8:85a3:0000:0000:8a2e:0370:7334. 39 Zeichen eignen sich zum Speichern von IPv6-Adressen in diesem Format.

Edit: Allerdings gibt es einen Vorbehalt, siehe @ Deepaks Antwort für Details zu IPv4-zugeordneten IPv6-Adressen. (Die korrekte maximale IPv6 Stringlänge ist 45 Zeichen.)

+4

Einige Datenbanken (mindestens PostgreS) haben einen nativen IP-Spaltentyp und übernehmen die Konvertierung für Sie. – gnud

+4

Ich würde vermeiden, IPv4 und IPv6 im gleichen Feld einer Datenbank für "eine Weile" zu mischen. IPv4 ist immer noch der Standardstandard und wird auch in den kommenden Jahren weiterhin verwendet werden. In Legacy-Anwendungen, mit denen ich gearbeitet habe, als es notwendig wurde, IPv6-Adressen zur Datenbank hinzuzufügen, wurde dies als separater Eintrag durchgeführt. Auf diese Weise konnte der vorhandene Code, der die erwartete IPv4-Adresse erwartete, beibehalten werden, und zugelassener Code erhielt weiterhin nur eine IPv4-Adresse. Für neue Teile des Codes hatten sie eine Option, um spezifisch IPv4, IPV6 oder eine Mischung aus der Abfrage zu erhalten. –

+0

Wenn Sie IPv4 als einzelnes Byte speichern würden, wäre es dann nicht mehr eine Frage, welche Datenstrukturen vom lesenden Client akzeptiert werden? Wenn Sie es als eine einzige INT speichern, und der Client binäre akzeptiert, ja, das wäre nicht gut ... Ich denke, der Punkt über eine größere Art von könnte eine gute Sorge sein, abhängig von der Anzahl und Raffinesse der Anwendungen. Möglicherweise verfügen Sie über Apps, die nur ein Format oder beides akzeptieren. Möglicherweise möchten Sie ein verwandtes Feld mit einer Adressierungsetikette haben. – benc

23

Wenn Sie in Standard-Notation IPV6 zu handhaben:

2001:0dc5:72a3:0000:0000:802e:3370:73E4 

32 hexadezimale Ziffern + 7 Separatoren = 39 Zeichen.

VORSICHT: Wenn IPV4-Adressen auch als IPV6-Adressen zugeordnet werden sollen, use 45 characters as @Deepak suggests.

5

Wie in dem Artikel IPv6 Wikipedia beschriebenen

IPv6-Adressen werden normalerweise als acht Gruppen zu je vier hexadezimalen Ziffern geschrieben, wobei jede Gruppe getrennt durch einen Doppelpunkt (:)

eine typische IPv6-Adresse:

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

Dies ist 39 Zeichen lang. IPv6-Adressen sind 128 Bit lang, so dass Sie möglicherweise eine binäre (16) Spalte verwenden könnten, aber ich denke, ich würde bei einer alphanumerischen Darstellung bleiben.

1

IPv4 verwendet 32 ​​Bits, in Form von:

255.255.255.255 

Ich nehme an, es auf dem Datentyp abhängt, ob Sie nur mit einem CHAR-Typ als String speichern oder wenn Sie einen numerischen verwenden Art.

IPv6 verwendet 128 Bits. Du wirst keine IPs länger haben, wenn du keine anderen Informationen mit ihnen einfügst.

IPv6 wird in Gruppen von vier hexadezimalen Ziffern durch Doppelpunkte getrennt gruppiert, wie (aus Wikipedia):

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

Sie sind sicher es als 39 Zeichen lange Zeichenfolge zu speichern, sollten Sie tun wollen, dass . Es gibt jedoch auch andere Möglichkeiten, Adressen zu schreiben. Mengen von Nullen können auf eine einzige 0 gekürzt werden, oder Mengen von Nullen können vollständig durch einen doppelten Doppelpunkt verborgen werden.

10

Nehmen Sie es von jemandem, der es alle drei Wege versucht hat, ... benutzen Sie einfach eine varchar (39)

Die etwas weniger effiziente Lagerung überwiegt bei weitem keinen Nutzen davon auf insert/update und es zu konvertieren, die formatiert werden wenn es irgendwo gezeigt wird.

2

Wenn Sie es nur als Referenz speichern, können Sie es als eine Zeichenfolge speichern, aber wenn Sie eine Suche durchführen möchten, zum Beispiel um zu sehen, ob die IP-Adresse in einer Tabelle ist, benötigen Sie eine "kanonische Darstellung . " Das gesamte Ding in eine (große) Zahl umzuwandeln ist das Richtige. IPv4-Adressen können als lange int (32 Bit) gespeichert werden, aber Sie benötigen eine 128-Bit-Nummer, um eine IPv6-Adresse zu speichern.

Zum Beispiel sind alle diese Strings sind wirklich die gleiche IP-Adresse: 127.0.0.1, 127.000.000.001, :: 1, 0: 0: 0: 0: 0: 0: 0: 1

323

Es gibt ein Vorbehalt mit der allgemeinen IPv6-Struktur mit 39 Zeichen. Für IPv4-zugeordnete IPv6-Adressen kann die Zeichenfolge länger sein (als 39 Zeichen). Ein Beispiel dieser zeigen:

IPv6 (39 Zeichen):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD 

IPv4-abgebildete IPv6 (45 Zeichen):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:192.168.158.190 

Hinweis: Die letzten 32 Bits (das entspricht IPv4-Adresse) kann bis zu 15 Zeichen lang sein (da IPv4 4 Gruppen mit 1 Byte verwendet und als 4 Dezimalzahlen im Bereich 0-255 getrennt durch Punkte formatiert ist (das . Zeichen), also das Maximum DDD.DDD.DDD.DDD).

Die richtige maximale IPv6 Stringlänge, daher ist 45.

Dies ist eigentlich eine Quizfrage in einem IPv6-Training war ich besucht. (Wir alle antworteten 39!)

+2

Es scheint mir, dass das nicht stimmt. Eine IPv6-Mapping-Adresse ist maximal 22 Zeichen lang gemäß: https://tools.ietf.org/html/rfc5952#page-10 und https://tools.ietf.org/html/rfc4291#section-2.5.5 as sie haben immer das Format :: ffff: 000.000.000.000 und sie müssen gekürzt werden – tarzan

+0

Ich frage mich, ob er wirklich "ipv6-kompatible ipv4-Adresse" meinte wie unter https://tools.ietf.org/html/rfc4291#section- 2.5.5.1. Ich erinnere mich nie daran, diese in freier Wildbahn gesehen zu haben. –

2

Leute sprechen über Zeichen, wenn man eine IP-Adresse in Rohdaten komprimieren kann.

Also im Prinzip, da wir nur IPv4 (32bit) oder IPv6 (128bit) verwenden, bedeutet das, dass Sie maximal 128 bit Speicherplatz benötigen, oder 128/8 = 16 Bytes!

Das ist viel weniger als die vorgeschlagenen 39 Bytes (angenommen, dass Zeichensatz ascii ist).

Das heißt, Sie müssen die IP-Adresse in/aus den Rohdaten dekodieren und kodieren, was an sich eine triviale Sache ist (ich habe es schon gemacht, siehe PHP ip2long() für 32-Bit IPs) .

Edit:inet_pton (und sein Gegenteil, inet_ntop()) tut, was Sie brauchen, und arbeitet mit beiden Adresstypen. Aber Vorsicht, unter Windows ist es seit PHP 5.3 verfügbar.

+0

@Elticipticalview Ich glaube nicht, dass Sie meine Antwort überhaupt gelesen haben. Ich habe noch nie 45 Bytes irgendwo erwähnt! Wenn Sie irgendeinen IPv4-Wert (auch schlechte, wie Sie erwähnt haben) in Rohdaten umwandeln, sollten sie niemals 4 Byte überschreiten - denn egal wie viele Punkte Sie haben, sie sollten immer 4 Zahlen von maximal 255 ergeben. – Christian

Verwandte Themen