Pruebe la función INET_ATON
SELECT ip FROM sn_192_168_0
ORDER BY INET_ATON(ip);
¡Pruébalo!
CAVEAT: es mejor no almacenar los valores INET_ATON. Existen algunos caprichos del pasado con esta función: tiene números inválidos entre puntos y lo llama en activadores.
Estos errores se limpian ahora.
Las direcciones IP cortas se manejan correctamente. Este es un ejemplo de MySQL 5.5.12 en Windows 7
mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1');
+------------------------+--------------------+
| INET_ATON('127.0.0.1') | INET_ATON('127.1') |
+------------------------+--------------------+
| 2130706433 | 2130706433 |
+------------------------+--------------------+
1 row in set (0.05 sec)
no tengo tiempo para construir un ejemplo completo en este momento, pero lo que parece que está haciendo es ordenar lexicográficamente (es decir, carácter por personaje). Tendrá que crear un SP (o lógica de aplicación) para forzarlo a clasificar numéricamente (es decir, dividir la dirección IP en cuatro partes y luego ordenarlas por cada una de las partes). Alternativamente, en lugar de dividirlo en cuatro partes, haga un entero único de la dirección IP (primer octeto de la dirección = primeros 8 bits del número, segundo octeto = segundo 8 bits y así sucesivamente) y ordene por eso - direcciones IP en realidad no son más que un entero bien disfrazado. –
@SimonRigharts eso es exactamente lo que está haciendo. La filosofía general es que sería más rápido (pero más costoso en el espacio) convertir todo a un campo de números grandes (o usar cuatro campos nuevos a 3 caracteres de ancho, o tres nuevos campos de bytes) y consultar para ordenar, pero presente este campo para fines de visualización. Hay bibliotecas para convertir la dirección IP a un campo numérico si no desea hacer el análisis usted mismo. – jcolebrand
Sin embargo, dado que esto es solo una cuestión de código, arrancándolo en [SO]. – jcolebrand