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
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
尝试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)
为什么我没有想到这一点?谢谢。 – 2013-11-02 23:46:46
可以使用
SELECT ip FROM sn_192_168_0 ORDER BY LPAD( ip, 16, 0)
16号是IP的最大长度
我没有时间来建立现在是一个完整的例子,但它看起来像是按照字典顺序排序(即逐个字符)。您需要构建一个SP(或应用程序逻辑)来强制它进行数字排序(即将IP地址分为四个部分,然后按每个部分对其进行排序)。或者,不要将其分成4部分,请从IP地址(地址的第一个字节=数字的前8位,第二个字节=第二个8位等等)中创建一个整数并按此排序 - IP地址实际上不过是一个伪装的整数。 – 2012-01-03 22:55:57
@SimonRigharts这正是它正在做的。一般的理念是,将所有内容都转换为大数字字段(或者在3个字符宽度内使用四个新字段,或者三个新字节字段),并且将其排序,但是存在此字段用于显示目的。如果您不想自己进行解析,有些库可将IP地址转换为数字字段。 – jcolebrand 2012-01-03 23:07:03
但是,由于这只是一个代码问题,因此将其引导至[SO]。 – jcolebrand 2012-01-03 23:08:17