I'm trying to convert A binary IP to a human-readable IP
SELECT HEX( `ip_bin` ) FROM `log_metadata`
gives me
4333D26E000000000000000000000000
And
SELECT INET_NTOA(0x4333D26E)
gives me 67.51.210.110
So I tried:
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`
But I only get
+----------+------------+------------+---------+
| A | B | C | D |
+----------+------------+------------+---------+
| 4333D26E | 0.0.16.237 | 0.0.16.237 | 0.0.0.0 |
+----------+------------+------------+---------+
Any suggestions?
When using Mysql 5.6.3 or later, it is easier to just use INET6_NTOA
- it takes a binary string and returns the human readable format for it. It also supports both IPv4 and IPv6 addresses and returns the format accordingly. So in your example you would use:
SELECT INET6_NTOA( `ip_bin` ) FROM `log_metadata`
And should get the human readable result.
I found I had to call HEX
to convert my binary field to a hex string first, so the following worked for me:
select inet_ntoa(conv(HEX(ip_bin), 16, 10)) from log_metadata
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)
Check if it works there too =)
The problem is that inet_ntoa
seems to parse from decimal strings
number representation, not hexadecimal ones, or from hexadecimal integers
. Compare:
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)
This is simpler and seems to work too:
SELECT INET_NTOA(CONV(ip_bin, 2, 10)) FROM log_metadata
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With