2011-01-04 8 views
10

Ich wollte varchar(20) verwenden, aber ich fragte mich, was ich tun sollte, wenn ich INT machen und stattdessen die Perioden streichen sollte. Was wäre besser und warum?Welchen Typ sollte ich IP-Adressen für MySQL speichern?

+0

Es hängt davon ab, welche Operationen Sie an den Daten ausführen werden. – zerkms

+3

Sie können nicht einfach die Perioden abzustreifen, oder Sie müssten jedes Oktett mit Nullen auffüllen, so dass sie alle 3 Zeichen lang sind. Ansonsten würden die IPs 192.168.45.5 und 192.168.4.55 gleich aussehen. Wenn Leute vorschlagen, ein int (32 Bit) zu verwenden, meinen Sie, dass Sie jedes Oktett (jeweils 8 Bits) nehmen und sie zu einem einzigen Int zusammenfassen. –

Antwort

16

Ich nehme an, Sie sind nur an IPv4-Adressen interessiert, nicht an IPv6.

Ich würde eine INT UNSIGNED für die Spalte verwenden und dann INET_ATON und INET_NTOA verwenden, um zwischen der Textdarstellung und dem int-Wert hin und her zu konvertieren.

mysql> SELECT INET_ATON('192.168.10.50'); 
+----------------------------+ 
| INET_ATON('192.168.10.50') | 
+----------------------------+ 
|     3232238130 | 
+----------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT INET_NTOA(3232238130); 
+-----------------------+ 
| INET_NTOA(3232238130) | 
+-----------------------+ 
| 192.168.10.50   | 
+-----------------------+ 
1 row in set (0.00 sec) 
0

Wenn Sie spart Platz wirklich besorgt sind, können Sie es in ein 4-Byte-int packen. Jeder Block einer IPv4-IP-Adresse kann 256 mögliche Werte haben, was zufälligerweise der Bereich eines einzelnen Bytes ist.

- Bearbeiten -> Was kann ich gerade beschrieben mit der MySQL-Funktionen f00 in seiner Antwort

jedoch verbunden getan wird, wird es als String speichert Zeit sparen ein bisschen Codierung. Ehrlich gesagt, es sei denn, Sie tun dies in einem sehr großen Maßstab, spielt die Optimierung aus einem dichteren Speicherformat keine Rolle.

Verwandte Themen