如何对 MySql 中的 IP 地址进行排序,使 ipv4 在 ipv6 地址之前?
How can I sort IP addresses in MySql, so ipv4 comes before ipv6 addresses?
我在 MySQL 中有一个 table,其中有一列包含 IP 地址 - 存储为 'VARCHAR(40)'。 ipv4和ipv6地址都被使用了。
现在我想对这些地址进行排序,但我希望所有 ipv4 地址排在所有 ipv6 地址之前。
我试过:
ORDER BY INET6_ATON(IpAddress)
其中 IpAddress
是列的名称。 INET6_ATON
returns一个'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_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
可以,但效果当然不是很好。
然后我(最终)将该列转换为 varbinary(16)
,在保存时使用 INET6_ATON
(或者在使用 DataTable 时使用 .Net 的 IPAddress.GetAddressBytes()
)。
现在我可以简单地做:
ORDER BY LENGTH(ipAddress) ASC, ipAddress ASC
非常有效。我现在让所有 ipv4 地址出现在所有 ipv6 地址之前。
我在 MySQL 中有一个 table,其中有一列包含 IP 地址 - 存储为 'VARCHAR(40)'。 ipv4和ipv6地址都被使用了。
现在我想对这些地址进行排序,但我希望所有 ipv4 地址排在所有 ipv6 地址之前。 我试过:
ORDER BY INET6_ATON(IpAddress)
其中 IpAddress
是列的名称。 INET6_ATON
returns一个'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_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
可以,但效果当然不是很好。
然后我(最终)将该列转换为 varbinary(16)
,在保存时使用 INET6_ATON
(或者在使用 DataTable 时使用 .Net 的 IPAddress.GetAddressBytes()
)。
现在我可以简单地做:
ORDER BY LENGTH(ipAddress) ASC, ipAddress ASC
非常有效。我现在让所有 ipv4 地址出现在所有 ipv6 地址之前。