如何对 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 地址之前。