Oft werden IP-Adressen in einem VARCHAR(15) Feld gespeichert. Doch das kostet viel mehr Speicher, als wenn man es in einem UNSIGNED INT(10) speichert. Um die IP-Adresse in einen Long zu verwandeln, gibt es die PHP Funktion ip2long(), in MySQL INET_ATON(). Um den Long wieder in eine IP-Adresse zu verwandeln, gibt es die Funktionen long2ip() in PHP, bzw. INET_NTOA() in MySQL. Hier eine Beispiel Query für MySQL:
SELECT INET_ATON("127.0.0.1"), INET_NTOA(2130706433)
Und es wird 2130706433 und 127.0.0.1 zurückgegeben. Auf diese Weise kann man aber auch gut die Datenbank auf bestimmte IP-Ranges überprüfen:
SELECT `foo` FROM `bar` WHERE `ip`<=INET_ATON('192.168.254.1') AND `ip`>=INET_ATON('192.168.254.254');
Hier habe ich nun noch eine Erklärung, warum dies so ist:
Eine IP besteht aus 4 Blöcken. Jeder Block hat einen Wertebereich von 0 bis 255. Ein Byte hat den gleichen Wertebereich. Nun muss man diese 4 Blöcke nur noch zu einem 4-Byte-Long zusammenfügen.
IP-Adresse: 192.168.254.1
-> IP in Hex: 0xC0.0xA8.0xFE.0×01
-> Punkte entfernen: 0xC0A8FE01
-> Dezimal: 3232300545
Das lässt sich dann natürlich auch problemlos zurück wandeln.
Ein VARCHAR(15) verbrauchte 16 Bytes. Ein 4-Byte-Long, wie der Name bereits sagt, nur 4 Bytes. Das macht also einen Mehrverbrauch von 300%, wenn man VARCHAR(15) nutzt.
