red*_*ent 7 mysql string binary string-formatting
我正在尝试将二进制IP转换为人类可读的IP
SELECT HEX( `ip_bin` ) FROM `log_metadata`
Run Code Online (Sandbox Code Playgroud)
给我
4333D26E000000000000000000000000
和
SELECT INET_NTOA(0x4333D26E)
Run Code Online (Sandbox Code Playgroud)
给我 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`
Run Code Online (Sandbox Code Playgroud)
但我只能得到
+----------+------------+------------+---------+
| A | B | C | D |
+----------+------------+------------+---------+
| 4333D26E | 0.0.16.237 | 0.0.16.237 | 0.0.0.0 |
+----------+------------+------------+---------+
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我发现我必须HEX首先调用将二进制字段转换为十六进制字符串,因此以下内容对我有用:
select inet_ntoa(conv(HEX(ip_bin), 16, 10)) from log_metadata
Run Code Online (Sandbox Code Playgroud)
当使用 Mysql 5.6.3 或更高版本时,它更容易使用INET6_NTOA- 它接受一个二进制字符串并为其返回人类可读的格式。它还支持 IPv4 和 IPv6 地址并相应地返回格式。因此,在您的示例中,您将使用:
SELECT INET6_NTOA( `ip_bin` ) FROM `log_metadata`
Run Code Online (Sandbox Code Playgroud)
并且应该得到人类可读的结果。
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)
Run Code Online (Sandbox Code Playgroud)
检查它是否也在那里工作 =)
问题是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)
Run Code Online (Sandbox Code Playgroud)
这更简单,似乎也有效:
SELECT INET_NTOA(CONV(ip_bin, 2, 10)) FROM log_metadata
Run Code Online (Sandbox Code Playgroud)