Duplicate possible:
Comment stocker une adresse IP dans MySQL
Je veux obtenir l'adresse IP de $_SERVER['REMOTE_ADDR']
Et d'autres variables $_SERVER
, Quel type de données est le bon pour cela?
Est-ce que VARCHAR(n)
?
Les adresses IPv4 ayant une longueur de 4 octets, vous pouvez utiliser un INT
(UNSIGNED
) qui a exactement 4 octets:
`ipv4` INT UNSIGNED
Et INET_ATON
et INET_NTOA
pour les convertir:
INSERT INTO `table` (`ipv4`) VALUES (INET_ATON("127.0.0.1"));
SELECT INET_NTOA(`ipv4`) FROM `table`;
Pour les adresses IPv6, vous pouvez utiliser BINARY
à la place:
`ipv6` BINARY(16)
Et utilisez PHP inet_pton
et inet_ntop
pour la conversion:
'INSERT INTO `table` (`ipv6`) VALUES ("'.mysqli_real_escape_string(inet_pton('2001:4860:a005::68')).'")'
'SELECT `ipv6` FROM `table`'
$ipv6 = inet_pton($row['ipv6']);
Vous avez deux possibilités (pour une adresse IPv4):
varchar(15)
, si vous souhaitez stocker l'adresse IP sous forme de chaîne 192.128.0.15
Par exempleinteger
(4 octets), si vous convertissez l'adresse IP en un entier 3229614095
Pour l'adresse IP que j'ai utilisée auparavant
La deuxième solution nécessitera moins d’espace dans la base de données et constitue probablement un meilleur choix, même si elle implique quelques manipulations lors du stockage et de la récupération des données (en les convertissant de/en chaîne) .
A propos de ces manipulations, voir les fonctions ip2long()
et long2ip()
, côté PHP, ou inet_aton()
et inet_ntoa()
du côté de MySQL.
Pour les adresses IPv4, vous pouvez utiliser VARCHAR pour les stocker sous forme de chaînes, mais vous pouvez également les stocker sous forme d'entiers longs INT(11) UNSIGNED
. Vous pouvez utiliser la fonction INET_ATON()
de MySQL pour les convertir en représentation entière. L'avantage de ceci est qu'il vous permet de faire des comparaisons faciles sur eux, comme BETWEEN
requêtes