2012-01-03 34 views
5

MySQL,试图获得一个ip地址列表,按顺序。排序....数字?帮我排序ip地址

此查询

select ip from sn_192_168_0 

给出了这样的

192.168.0.1 
192.168.0.10 
192.168.0.100 
192.168.0.101 

我们希望

192.168.0.1 
192.168.0.2 
...snip.. 
192.168.0.10 
+0

我没有时间来建立现在是一个完整的例子,但它看起来像是按照字典顺序排序(即逐个字符)。您需要构建一个SP(或应用程序逻辑)来强制它进行数字排序(即将IP地址分为四个部分,然后按每个部分对其进行排序)。或者,不要将其分成4部分,请从IP地址(地址的第一个字节=数字的前8位,第二个字节=第二个8位等等)中创建一个整数并按此排序 - IP地址实际上不过是一个伪装的整数。 – 2012-01-03 22:55:57

+0

@SimonRigharts这正是它正在做的。一般的理念是,将所有内容都转换为大数字字段(或者在3个字符宽度内使用四个新字段,或者三个新字节字段),并且将其排序,但是存在此字段用于显示目的。如果您不想自己进行解析,有些库可将IP地址转换为数字字段。 – jcolebrand 2012-01-03 23:07:03

+0

但是,由于这只是一个代码问题,因此将其引导至[SO]。 – jcolebrand 2012-01-03 23:08:17

回答

15

尝试INET_ATON功能

SELECT ip FROM sn_192_168_0 
ORDER BY INET_ATON(ip); 

试试吧!

CAVEAT:最好不要存储INET_ATON值。这个函数有一些过去的怪癖,你有点之间的无效数字,并在触发器中调用它。

这些错误现在清理。

短IP地址处理正确。下面是从MySQL 5.5.12 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) 
+0

为什么我没有想到这一点?谢谢。 – 2013-11-02 23:46:46

0

可以使用

SELECT ip FROM sn_192_168_0 ORDER BY LPAD( ip, 16, 0) 

16号是IP的最大长度