1

我将 ip 地址保存为字符串,使用 phpinet_pton作为四字节字符串。要使用 mysql 创建人类可读的表示,我想使用inet_ntoaMySQL,但是,它似乎只接受整数值。

那么,我如何将一个字符串!"#(对应于 ip 32.33.34.35,还要注意空格)读取为整数(对应539042339于本例中)?

4

2 回答 2

2

您可以使用某些东西Hex()将字符串转换为十六进制,然后Conv()将其转换为基数 10。

SELECT inet_ntoa(conv(hex(' !"#'), 16, 10))

于 2012-07-12T20:37:14.130 回答
1

使用 MySQL < 5.6.3,您可以使用 和 的组合来做到这SUBSTR()一点ORD()

SELECT INET_NTOA(
    ORD(SUBSTR(' !"#', 1, 1)) * 16777216 +
    ORD(SUBSTR(' !"#', 2, 1)) * 65536 +
    ORD(SUBSTR(' !"#', 3, 1)) * 256 +
    ORD(SUBSTR(' !"#', 4, 1)))

结果是:

32.33.34.35

此外,由于您实际上已经在那里,您可以自己创建字符串CONCAT()

SELECT CONCAT(
    ORD(SUBSTR(' !"#', 1, 1)), '.',
    ORD(SUBSTR(' !"#', 2, 1)), '.',
    ORD(SUBSTR(' !"#', 3, 1)), '.',
    ORD(SUBSTR(' !"#', 4, 1)))

我希望您在 MySQL 5+ 或二进制列中使用 VARCHAR(而不是 CHAR),这样您就不会丢失尾随空格。

要支持 IPv6,您需要先使用IF语句检查长度,然后进行稍微不同的连接。

在 MySQL 5.6.3 中,新INET6_NTOA()功能直接支持这一点。它接受二进制字符串并同时支持 IPv4 和 IPv6:

SELECT INET6_NTOA(' !"#')
于 2012-07-12T19:03:47.413 回答