Normalmente no hablo de lo que hago como programador... pero bueno, alguna vez tenía que empezar.
En este caso, implemente el feature de saber de qué país procede un usuario, el cual tiene muchas aplicaciones. Desde el simple "Tu país es xxx" hasta mostrar contenido personalizado de acuerdo al país del usuario.
MaxMind provee la base de datos de rangos de ip y el país al cual proceden en un formato CSV listo para cargar a la base de datos. La versión free/gpl tiene un 99.3% de precisión, no da ni ciudad ni coordenadas geográficas, pero nos sirva para empezar.
MaxMind da las instrucciones para utilizar los datos, http://www.maxmind.com/app/csv sugiere convertir manualmente la dirección IP a entero, pero mysql ya posee esa función.
Primero necesitamos la tabla:
CREATE TABLE `geoip` (
`beginip` varchar(16) NOT NULL,
`endip` varchar(16) NOT NULL,
`beginnum` int(11) unsigned NOT NULL,
`endnum` int(11) unsigned NOT NULL,
`code` varchar(2) NOT NULL,
`country` varchar(128) NOT NULL,
PRIMARY KEY (`beginnum`),
UNIQUE KEY `end_num` (`endnum`),
KEY `code` (`code`)
) ENGINE=MyISAM;
La tabla contiene el mismo orden que las columnas del csv.
Luego cargamos el csv dentro mysql:
mysql> LOAD DATA LOCAL INFILE "geoip.csv" INTO TABLE `geoip`
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';
Con eso cargamos los más de 100000 registros.
Luego la consulta que nos retorna el país:
mysql> select code from geoip where endnum >= INET_ATON('166.114.108.10') order by endnum asc limit 1;
+------+
| code |
+------+
| BO |
+------+
1 row in set (0.00 sec)
mysql> select code from geoip where endnum >= INET_ATON('169.23.46.2') order by endnum asc limit 1;
+------+
| code |
+------+
| US |
+------+
1 row in set (0.04 sec)
mysql> select code from geoip where endnum >= INET_ATON('200.86.1.1') order by endnum asc limit 1;
+------+
| code |
+------+
| CL |
+------+
1 row in set (0.06 sec)
Bueno, nosotros construimos nuestra aplicación encima de zend (framework), y en nuestro modelo GeoIp_Manager tenemos este método:
public function findCountryByIp($ip) {
if ($this->_ipvalidator->isValid($ip)) {
$select = $this->select()
->where('endnum >= INET_ATON(?)', $ip);
$iprange = $this->fetchRow($select, 'endnum asc');
return $iprange->getCountry();
} else {
throw new GeoIp_Exception("Invalid ip ($ip)");
}
// not found
return null;
}
Con eso obtenemos el país de un determinado ip, luego tenemos unos par de helpers para mostrar una banderita y demás chucherías. Algo similar a esto:
$country = $geoip->findCountryByIp($request->getUserIp());
echo $this->isoCountryFlag($country);
Pero tenemos los datos de los países en otra tabla, así quitamos los campos varchar de la tabla geoip y hacemos nuestra consulta más eficiente.
De a poco ire publicando más sobre el know-how que voy adquiriendo y me da sentimiento de culpabilidad no compartirlo, por que al final... yo tambien lo saque de algún lado
Palabras clave: findCountryByIp, geoip, pais, zend

... pero sirven para el sensacionalismo. 
) 

decidi adquirir uno nuevo... pero no d-link.