Mögliches Duplikat:
Wie speichere ich eine IP in mySQL?
Ich möchte die IP-Adresse aus $_SERVER['REMOTE_ADDR']
Und einigen anderen $_SERVER
Variablen erhalten. Welcher Datentyp ist der richtige dafür?
Ist es VARCHAR(n)
?
Da IPv4-Adressen 4 Byte lang sind, können Sie ein INT
(UNSIGNED
) mit genau 4 Byte verwenden:
`ipv4` INT UNSIGNED
Und INET_ATON
und INET_NTOA
um sie zu konvertieren:
INSERT INTO `table` (`ipv4`) VALUES (INET_ATON("127.0.0.1"));
SELECT INET_NTOA(`ipv4`) FROM `table`;
Für IPv6-Adressen können Sie stattdessen ein BINARY
verwenden:
`ipv6` BINARY(16)
Und benutze PHPs inet_pton
und inet_ntop
zur Umrechnung:
'INSERT INTO `table` (`ipv6`) VALUES ("'.mysqli_real_escape_string(inet_pton('2001:4860:a005::68')).'")'
'SELECT `ipv6` FROM `table`'
$ipv6 = inet_pton($row['ipv6']);
Sie haben zwei Möglichkeiten (für eine IPv4-Adresse):
varchar(15)
, wenn Sie die IP-Adresse als Zeichenfolge speichern möchten 192.128.0.15
integer
(4 Bytes), wenn Sie die IP-Adresse in eine Ganzzahl konvertieren3229614095
Für die zuvor verwendete IP
Die zweite Lösung benötigt weniger Speicherplatz in der Datenbank und ist wahrscheinlich die bessere Wahl, auch wenn sie einige Manipulationen beim Speichern und Abrufen der Daten erfordert (Konvertieren von/in einen String) .
Informationen zu diesen Manipulationen finden Sie in den Funktionen ip2long()
und long2ip()
auf der PHP-Seite oder inet_aton()
und inet_ntoa()
auf der MySQL-Seite.
Für IPv4-Adressen können Sie VARCHAR verwenden, um sie als Zeichenfolgen zu speichern, aber auch, um sie als lange Ganzzahlen INT(11) UNSIGNED
zu speichern. Sie können die Funktion INET_ATON()
von MySQL verwenden, um sie in eine Ganzzahldarstellung zu konvertieren. Dies hat den Vorteil, dass Sie einfache Vergleiche mit ihnen durchführen können, wie z. B. BETWEEN
Abfragen