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)

そこでも機能するかどうかを確認してください =)

編集

問題は、 16 進数ではなく10 進数表現、または 16進数表現inet_ntoaから解析するように見えることです。比較: stringsintegers

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 に答える
5

HEX最初にバイナリフィールドを16進文字列に変換するために呼び出す必要があることがわかったので、次のようにしました:

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