Frage

Ich muss die IP -Adresse aller registrierten Benutzer in der Datenbank speichern. Ich frage mich, wie viele Charaktere sollte ich für eine solche Kolumne deklarieren?

Soll ich auch IPv6 unterstützen? Wenn ja, wie hoch ist die maximale Länge der IP -Adresse?

War es hilfreich?

Lösung

Speichern Sie nicht als Zeichenfolge. Benutze ein int unsigned Spalte und speichern/abrufen mit INET_ATON() und INET_NTOA() beziehungsweise. Afaik MySQL unterstützt INET_* für IPv6 nicht.

BEARBEITEN gemäß Kommentar

Die Verwendung integrierter Funktionen zum Umwandeln von IPs in/von Ganzzahlen (und so und das Speichern dieser Ganzzahlen in der Datenbank) hat die Nebenwirkung, diese IPs automatisch zu validieren. Angenommen, Sie speichern eine IP als Varchar (16), Sie müssen sicherstellen, dass Sie ungültige IPs (wie 999.999.999.999 als Beispiel) mit einer benutzerdefinierten Validierung nicht speichern. Inet_* Funktionen kümmern sich darum.

Andere Tipps

Es ist wahrscheinlich an der Zeit, IPv6 in Betracht zu ziehen. MySQL verfügt nicht über Methoden zum Umwandeln von IPv6 -Adressen in das Binärformat. Eine vierzig Zeichenzeichenfolge behandelt normale IPv6 -Adressen. Es gibt ein Format, das 40 Zeichen überschreiten könnte. Ich würde diejenigen, die es unwahrscheinlich betrachten, die Praxis zu erleiden.

Sie können die Größe von damals Informationen berechnen, dass es höchstens 8 vier Charaktergruppen mit 7 Separatorzeichen geben. Das abnormale Format ersetzt die letzten beiden Gruppen durch eine IPv4 -Formatadat. Ohne Adresskomprimierung ersetzt es die letzten 9 Zeichen durch bis zu 15 Zeichen.

Wenn Sie Blöcke speichern, kann die Blockgrößenanzeige eher 4 Zeichen als die 3 Zeichen für IPv4 einnehmen.

Sie sollten sicherstellen, dass die Formatierung, die Sie erhalten, konsistent ist, aber alle Software, die ich gesehen habe, enthält konsistente Formate für die Adressen.

Ich würde vorschlagen, dass migration zu postgresql und verwendet wird von Inet oder cidr Datentypen.

CREATE TABLE test ( test_id serial PRIMARY KEY, address inet );
INSERT INTO test ( address ) VALUES ( '1.2.3.4'::inet );
INSERT INTO test ( address ) VALUES ( 'a:b::c:d'::inet );
SELECT * FROM test;
 test_id | address  
---------+----------
       1 | 1.2.3.4
       2 | a:b::c:d

Hier ist die beste Antwort in einer der MySQL -Mailinglisten. Lesen Beste FieldType zum Speichern von IP -Adresse ....

Kurz gesagt, es wird vorgeschlagen, dass ich int (10) nicht signiert habe.

  1. Es verwendet weniger Speicher (nur 4 Bytes)
  2. Am besten zum Sortieren und Durchsuchen der IP -Bereiche, insbesondere wenn Sie nach Herkunftsland Ihrer Besucher suchen.

Also mit 192.168.10.50:

(192 * 2^24) + (168 * 2^16) + (10 * 2^8) + 50 = 3232238130 (Ergebnisse in 192.168.10.50)

In MySQL können Sie direkt verwenden SELECT INET_ATON('192.168.10.50');bekommen 3232238130.

Oder

192 + (168 * 2^8) + (10 * 2^16) + (50 * 2^24) = 839559360 (rückwärts führt zu 50,10,168,192)

In MySQL können Sie direkt verwenden SELECT INET_NTOA(3232238130);bekommen 192.168.10.50 der Rücken.

Ab MySQL v5.6.3 fügten sie Unterstützung für die Unterstützung hinzu INET6_ATON und INET6_NOTA Dies wird sich um IPv4- und IPv6 -Adressen kümmern. Aber sie speichern es nicht mehr als Ganzzahl. IPv6 gibt a zurück varbinary(16) und und IPv4 gibt a zurück varbinary(4).

http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton

Sie können bis zu 15 Charaktere aufbewahren. Bitte verwenden Sie VARCHAR (15) nicht, da das 16 Bytes sind (das erste Byte verwaltet die Stringlänge und somit langsamer Abruf und Speicher). Verwenden Sie CHAR (15) immer bei einer IP -Adresse.

Entschuldigung, ich kann keine Antworten kommentieren. Da ist ein Frage dazu auf Stackoverflow. Und ich stimme voll und ganz der ausgewählten Antwort zu: Die Verwendung von 2xBigint ist wahrscheinlich der beste Weg für IPv6.

Ich würde 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.

Es ist auch möglich, IPv4 auf diesen Bigints zu speichern - entweder durch das Markieren eines von ihnen oder durch Verwendung von V4Compat -Format

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top