Convertir un UNSIGNED INT en SIGNED INT

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

10 août 2006, 23:34

J'ai créé une table SQL à partir de la base de données gratuite de GeoIP. La table contient des adresses IP converties en UNSIGNED INT (autrement dit des nombres 32 bits non-signés). J'aimerais les convertir dans un format compatible avec ip2long() et long2ip() (donc 32 bits signés). Je l'ai déjà fait plusieurs fois par le passé mais je n'arrive pas à le retrouver dans mes fichiers, si quelqu'un avait sous la main l'algorithme qui fait ça, ce serait super cool de m'en faire part merci :D

Je vous rappelle le problème. Sous MySQL:

Code : Tout sélectionner

mysql> SELECT INET_ATON('222.253.92.0'); +---------------------------+ | INET_ATON('222.253.92.0') | +---------------------------+ | 3741146112 | +---------------------------+
En PHP
echo ip2long('222.253.92.0');
// => -553821184
Mon but: convertir 3741146112 en -553821184 en SQL pour pouvoir convertir la table avec un simple UPDATE

Eléphant du PHP | 184 Messages

11 août 2006, 01:04

Ne peux tu pas te servir de intval() ?

-553821184 = intval(3741146112)
Image

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

11 août 2006, 01:26

Et bien non, la bonne réponse était*

Code : Tout sélectionner

ALTER table CHANGE ip_range_start ip_range_start BIGINT, ip_range_end ip_range_end BIGINT; UPDATE table SET ip_range_start = ip_range_start - 4294967296 WHERE ip_range_start > 2147483647; UPDATE table SET ip_range_end = ip_range_end - 4294967296 WHERE ip_range_end > 2147483647; ALTER table CHANGE ip_range_start ip_range_start INT, ip_range_end ip_range_end INT;
* à première vue, mais si quelqu'un pense que je me suis planté n'hésitez pas