9

我正在尝试将二进制 IP 转换为人类可读的 IP

SELECT HEX( `ip_bin` ) FROM `log_metadata`

给我 4333D26E000000000000000000000000

SELECT INET_NTOA(0x4333D26E)

给我67.51.210.110

所以我尝试了:

SELECT
  SUBSTRING( CONVERT(HEX(`ip_bin`), CHAR(32)), 1, 8 ) AS `A`
, INET_NTOA( 
  SUBSTRING( CONVERT(HEX(`ip_bin`), CHAR(32)), 1, 8 ) 
                                                     ) AS `B`
, INET_NTOA(hex(`ip_bin`))  AS `C`
, INET_NTOA(`ip_bin`)       AS `D`
FROM `log_metadata`

但我只得到

+----------+------------+------------+---------+
| A        | B          | C          | D       |
+----------+------------+------------+---------+
| 4333D26E | 0.0.16.237 | 0.0.16.237 | 0.0.0.0 |
+----------+------------+------------+---------+

有什么建议么?

4

4 回答 4

7
mysql> select inet_ntoa(conv('4333d26e', 16, 10));
+-------------------------------------+
| inet_ntoa(conv('4333d26e', 16, 10)) |
+-------------------------------------+
| 67.51.210.110                       |
+-------------------------------------+
1 row in set (0.00 sec)

检查它是否也可以在那里工作=)

编辑

问题是它inet_ntoa似乎是从十进制 strings数字表示,而不是十六进制表示,或者从 hexadecimal 解析的integers。比较:

mysql> select inet_ntoa(0x4333d26e);
+-----------------------+
| inet_ntoa(0x4333d26e) |
+-----------------------+
| 67.51.210.110         |
+-----------------------+
1 row in set (0.02 sec)

mysql> select inet_ntoa('0x4333d26e');
+-------------------------+
| inet_ntoa('0x4333d26e') |
+-------------------------+
| 0.0.0.0                 |
+-------------------------+
1 row in set, 1 warning (0.00 sec)

编辑

这更简单,似乎也有效:

SELECT INET_NTOA(CONV(ip_bin, 2, 10)) FROM log_metadata
于 2013-03-12T19:59:06.920 回答
7

当使用 Mysql 5.6.3 或更高版本时,它更容易使用INET6_NTOA——它接受一个二进制字符串并为其返回人类可读的格式。它还支持 IPv4 和 IPv6 地址并相应地返回格式。因此,在您的示例中,您将使用:

SELECT INET6_NTOA( `ip_bin` ) FROM `log_metadata`

并且应该得到人类可读的结果。

于 2017-10-18T15:26:09.817 回答
5

我发现我必须先调用HEX将我的二进制字段转换为十六进制字符串,所以以下对我有用:

select inet_ntoa(conv(HEX(ip_bin), 16, 10)) from log_metadata
于 2014-12-15T16:49:13.907 回答
3

仅供参考~这适用于较新版本的mysql

 SELECT INET6_NTOA( `ip_bin` ) FROM `log_metadata`

这与

SELECT INET_NTOA( CONV( SUBSTRING(HEX(`ip_bin` ), 1, 8), 16, 10 )) FROM log_metadata;
于 2018-11-14T14:59:16.373 回答