如何在mysql中将二进制数据解释为整数

时间:2012-07-12 17:57:06

标签: php mysql character-encoding

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

那么,我如何读取像!"#这样的字符串(对应于ip 32.33.34.35,也注意空格)作为整数(在这个例子中对应539042339)?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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)))

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

要支持IPv6,您需要先使用IF语句检查长度,然后以不同的方式连接。

使用MySQL 5.6.3,新的INET6_NTOA()函数直接支持此功能。它接收二进制字符串并支持IPv4和IPv6:

SELECT INET6_NTOA(' !"#')