2010-03-29 4 views
57

Was ist der effizienteste Weg zum Speichern und Abrufen von IP-Adressen in MySQL? Im Moment bin ich tun:Der effizienteste Weg, IP-Adresse in MySQL zu speichern

SELECT * FROM logins WHERE ip = '1.2.3.4' 

Wo ip ein VARCHAR(15) Feld ist.

Gibt es einen besseren Weg, dies zu tun?

+11

Ok, also ist Ihr Programm kaputt oder funktioniert überhaupt nicht mit IPv6 ... Seufzer. – Juliano

Antwort

95

Für IPv4 addresses, Sie können sie als int unsigned speichern möchten und verwenden Sie die INET_ATON() und INET_NTOA() Funktionen der IP-Adresse aus seinem numerischen Wert zurück, und umgekehrt.

Beispiel:

SELECT INET_ATON('127.0.0.1'); 

+------------------------+ 
| INET_ATON('127.0.0.1') | 
+------------------------+ 
|    2130706433 | 
+------------------------+ 
1 row in set (0.00 sec) 


SELECT INET_NTOA('2130706433'); 

+-------------------------+ 
| INET_NTOA('2130706433') | 
+-------------------------+ 
| 127.0.0.1    | 
+-------------------------+ 
1 row in set (0.02 sec) 
+4

würden Sie nicht als 'INT' sondern als' INT UNSIGNED' speichern. Ich mag jedoch die Verwendung von absichtlich eingebauten Funktionen. +1 – pstanton

+0

Danke. Weißt du, ob es dafür eine Python-Funktion gibt? – ensnare

+0

@ensnare: Ja, überprüfen Sie dies: http://snipplr.com/view/14807/convert-ip-to-int-and-int-to-ip/. –

4

Das Wichtigste ist, dass die Spalte indiziert wird. Dies könnte bei Abfragen basierend auf der IP-Adresse einen großen Unterschied machen.

+0

Mein Verständnis ist, dass Indizes auf einem Varchar von begrenzter Unterstützung sind. – flickerfly

1

Vielleicht speichern Sie den Integer-Wert direkt in einem Integer-Feld? Eine IP-Adresse ist grundsätzlich 4 "shorts".

Check it out: http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip

+0

also würde er es in vier Feldern speichern? und sie würden Bytes sein, nicht? 2^8 jedes Mal Alternativ könnte er sie in Dezimalzahlen konvertieren und die Dezimalzahl speichern, obwohl das ein größeres Feld wäre, wäre es ein einzelnes Feld. – jcolebrand

+1

Eine angemessenere Umgangssprache wäre zu sagen, dass eine IP-Adresse 4 Bytes ist. –

+0

Ich habe das Wesentliche. Brian sagt, dass konzeptionell ein Int aus vier Shorts besteht. Ein Kurzschluss ist ein Byte. Ein int ist 4 Bytes. Wie an anderer Stelle auf dieser Seite erwähnt, muss es ein unsigned int sein. – joe

52

Wenn Sie nur IPv4-Adressen speichern möchten, dann können Sie speichern sie in einem 32-Bit-Integer-Feld.

Wenn Sie auch IPv6 unterstützen möchten, dann ist eine Zeichenfolge wahrscheinlich die am einfachsten zu lesende/verwenden (obwohl Sie technisch in einem 16-Byte-Feld VARBINARY() speichern könnte, wäre es ärgerlich zu versuchen, zu generieren SQL-Anweisungen zur Auswahl per IP-Adresse "von Hand")

+18

+1: die einzige Antwort, die die Verwendung von IPv6 voraussagt – Juliano

+3

Nur bei der Verwendung IPV6 die Funktionen sind unterschiedlich (INET6_ATON (ip)). IPV4 benötigt VARBINARY (4) und IPV6 würde VARBINARY (16) benötigen (was natürlich auch für V4-Adressen funktioniert). Sie können ein V4 IP (INT) in ein kompatibles Format wie dieses konvertieren: INET6_ATON (INET_NTOA (ip)) – John

1

Was ist für Sie am einfachsten zu arbeiten. Das Problem Größe oder Geschwindigkeit ist kein Problem, bis Sie wissen, dass es ein Problem durch Profiling ist. In einigen Fällen ist es einfacher, mit einer Zeichenfolge zu arbeiten, wenn Sie eine Teilübereinstimmung vornehmen müssen. Aber als Platz- oder Leistungsproblem sollten Sie sich keine Sorgen machen, es sei denn, Sie haben Grund zur Sorge.