搞了一下午了,没搞出来,来求助万能的 V 友了
列 src_ip 类型是 binary(16)
mysql> desc X20180327;
+--------------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------------------+------+-----+---------+----------------+
| auto_id | int(10) unsigned | NO | MUL | NULL | auto_increment |
| record_id | int(10) unsigned | NO | PRI | NULL | |
| src_zone | int(10) unsigned | NO | | NULL | |
| src_ip | binary(16) | NO | MUL | NULL | |
| src_port | smallint(5) unsigned | NO | | NULL | |
| dst_zone | int(10) unsigned | NO | | NULL | |
| dst_ip | binary(16) | NO | MUL | NULL | |
| dst_port | smallint(5) unsigned | NO | | NULL | |
存储方式如下:
首字节存储非法 IPv6 头,后 4 字节存储 ipv4 数值,其他字节填充 0,网络序存储
mysql> select HEX(src_ip) from FW_LOG_fwlog.X20180327 where auto_id = 1;
+----------------------------------+
| HEX(src_ip) |
+----------------------------------+
| FFBF000000000000000000007BF94C7D |
+----------------------------------+
1 row in set (0.00 sec)
我单独把值复制出来转换时没问题的
mysql> select inet_ntoa(0xFFBF000000000000000000007BF94C7D & 0xFFFFFFFF) from FW_LOG_fwlog.X20180327 where auto_id = 1;
+------------------------------------------------------------+
| inet_ntoa(0xFFBF000000000000000000007BF94C7D & 0xFFFFFFFF) |
+------------------------------------------------------------+
| 123.249.76.125 |
+------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select inet_ntoa(0xFFBF000000000000000000007BF94C7D) from FW_LOG_fwlog.X20180327 where auto_id = 1;
+-----------------------------------------------+
| inet_ntoa(0xFFBF000000000000000000007BF94C7D) |
+-----------------------------------------------+
| 123.249.76.125 |
+-----------------------------------------------+
1 row in set (0.00 sec)
mysql> select inet_ntoa(0x7BF94C7D);
+-----------------------+
| inet_ntoa(0x7BF94C7D) |
+-----------------------+
| 123.249.76.125 |
+-----------------------+
1 row in set (0.00 sec)
但是………………
mysql> select INET_NTOA(src_ip) from FW_LOG_fwlog.X20180327 where auto_id = 1;
+-------------------+
| INET_NTOA(src_ip) |
+-------------------+
| 0.0.0.0 |
+-------------------+
1 row in set, 1 warning (0.00 sec)
mysql> select inet_ntoa(src_ip&0xFFFFFFFF) from FW_LOG_fwlog.X20180327 where auto_id = 1;
+------------------------------+
| inet_ntoa(src_ip&0xFFFFFFFF) |
+------------------------------+
| 0.0.0.0 |
+------------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+-----------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: '??' |
+---------+------+-----------------------------------------+
1 row in set (0.00 sec)
该怎么处理呢? 版本:Ver 14.14 Distrib 5.1.58
1
msg7086 2018-03-27 21:46:55 +08:00
试试 cast src_ip 到 interger 再运算。
|
2
axisray OP @msg7086
``` mysql> select INET_NTOA(CAST(src_ip AS UNSIGNED)) from FW_LOG_fwlog.X20180327 wh ere auto_id = 1; +-------------------------------------+ | INET_NTOA(CAST(src_ip AS UNSIGNED)) | +-------------------------------------+ | 0.0.0.0 | +-------------------------------------+ 1 row in set, 1 warning (0.00 sec) ``` |
3
msg7086 2018-03-28 09:24:32 +08:00 1
+-----------------------------------------------+
| inet_ntoa(conv(substr(hex(src_ip),-8),16,10)) | +-----------------------------------------------+ | 123.249.76.125 | +-----------------------------------------------+ 1 row in set (0.00 sec) |
4
axisray OP @msg7086
哈哈哈,我刚搞定,想法差不多 mysql> select inet_ntoa(conv(right(HEX(src_ip),8),16,10)) from FW_LOG_fwlog.X20180327 limit 100; +---------------------------------------------+ | inet_ntoa(conv(right(HEX(src_ip),8),16,10)) | +---------------------------------------------+ | 1.31.58.142 | | 14.204.67.143 | | 14.204.126.70 | | 27.156.89.140 | | 37.187.148.221 | 虽然这样有点恶心………………行了就这样吧,谢谢啦兄弟! |