如何在MySql中对IP地址进行排序,使ipv4优先于ipv6地址?
我在MySQL中有一个表,其中有一列包含ip地址——存储为“VARCHAR(40)”。同时使用ipv4和ipv6地址 现在我想对这些地址进行排序,但我希望所有ipv4地址都排在所有ipv6地址之前。 我试过:如何在MySql中对IP地址进行排序,使ipv4优先于ipv6地址?,mysql,sql,sql-order-by,ip-address,Mysql,Sql,Sql Order By,Ip Address,我在MySQL中有一个表,其中有一列包含ip地址——存储为“VARCHAR(40)”。同时使用ipv4和ipv6地址 现在我想对这些地址进行排序,但我希望所有ipv4地址都排在所有ipv6地址之前。 我试过: ORDER BY INET6\u ATON(IpAddress)其中IpAddress是列的名称INET6\u ATON返回一个“VARBINARY(16)” 对其进行排序将得到如下结果: 35.229.251.134 2405:204:900e:e66c::1441:48a1 37.9.
ORDER BY INET6\u ATON(IpAddress)
其中IpAddress
是列的名称INET6\u ATON
返回一个“VARBINARY(16)”
对其进行排序将得到如下结果:
35.229.251.134
2405:204:900e:e66c::1441:48a1
37.9.113.28
ipv4和ipv6混合在一起。这当然是因为24(十六进制)是36(十进制),介于35和37之间
我如何对ip地址进行排序,使ipv4总是排在ipv6之前
编辑:
我正在考虑使用“
INET6\u ATON
”存储值,将列更改为“VARBINARY(16)”。这是否提供了更多的可能性?您可以查找
并将它们放在第一位:
order by (ipaddress not like '%:%') desc, -- ipv4 desc
INET6_ATON(IpAddress)
这就是我想到的。首先我做了:
ORDER BY LENGTH(INET6_ATON(ipAddress)) ASC, INET6_ATON(ipAddress) ASC
这是可行的,但当然不是很有效
然后,我(最后)在保存时使用INET6\u ATON
(或者在使用数据表时使用.Net的IPAddress.GetAddressBytes()
)将列转换为varbinary(16)
现在我可以简单地做到:
ORDER BY LENGTH(ipAddress) ASC, ipAddress ASC
这是非常有效的。我现在将所有ipv4地址显示在所有ipv6地址之前。这不会将“::ffff:255.255.255.255”放在所有内容之前吗?@PoulBak。问题中没有这样的例子。这是一个边缘案例。但是我把答案改成了冒号而不是句号。