Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySql中对IP地址进行排序,使ipv4优先于ipv6地址?_Mysql_Sql_Sql Order By_Ip Address - Fatal编程技术网

如何在MySql中对IP地址进行排序,使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.

我在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.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。问题中没有这样的例子。这是一个边缘案例。但是我把答案改成了冒号而不是句号。