Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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 SQL:二进制到IP地址_Mysql_String_Binary_String Formatting - Fatal编程技术网

Mysql SQL:二进制到IP地址

Mysql SQL:二进制到IP地址,mysql,string,binary,string-formatting,Mysql,String,Binary,String Formatting,我正在尝试将二进制IP转换为人类可读的IP SELECT HEX( `ip_bin` ) FROM `log_metadata` 给我 4333D26E000000000000000000000000 及 给我67.51.210.110 所以我试着: SELECT SUBSTRING( CONVERT(HEX(`ip_bin`), CHAR(32)), 1, 8 ) AS `A` , INET_NTOA( SUBSTRING( CONVERT(HEX(`ip_bin`), CHAR(

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

SELECT HEX( `ip_bin` ) FROM `log_metadata`
给我
4333D26E000000000000000000000000

给我
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 |
+----------+------------+------------+---------+
有什么建议吗

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\u ntoa
似乎是从十进制
字符串
数字表示法而不是十六进制数进行解析,或者从十六进制
整数
进行解析。比较:

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

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

select inet_ntoa(conv(HEX(ip_bin), 16, 10)) from log_metadata

当使用Mysql 5.6.3或更高版本时,只需使用
INET6\u NTOA
,它会获取一个二进制字符串并返回人类可读的格式。它还支持IPv4和IPv6地址,并相应地返回格式。因此,在您的示例中,您将使用:

SELECT INET6_NTOA( `ip_bin` ) FROM `log_metadata`

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

FYI~这在较新版本的mysql中有效

 SELECT INET6_NTOA( `ip_bin` ) FROM `log_metadata`
这和

SELECT INET_NTOA( CONV( SUBSTRING(HEX(`ip_bin` ), 1, 8), 16, 10 )) FROM log_metadata;

可能是字符串
A
前面缺少的
0x
。请尝试。它只是返回了
0
并且
0.0.0
我最终使用了
INET\u-NTOA(CONV(子字符串(十六进制,1,8,16,10))
试试这个:
从日志元数据中选择INET\u-toa(CONV(ip\u-bin,2,10))
不起作用。问题在于,由于某种原因,这些位位于左侧-
0x4333d26e00000000000000000000000000000
您可以尝试将这些位移到右侧。Mysql有移位运算符。然而,Mysql似乎讨厌这些运算符。我的最佳猜测是,它将值解析为整数max,而适当的存储类型是VARBINARY(16)-VAR,因为ipv4为4,ipv6为16
SELECT INET_NTOA( CONV( SUBSTRING(HEX(`ip_bin` ), 1, 8), 16, 10 )) FROM log_metadata;