我使用php的inet_pton
作为四字节字符串将ip地址保存为字符串。要使用mysql创建一个人类可读的表示,我想使用inet_ntoa
MySQL,但它似乎只接受整数值。
那么,我如何读取像!"#
这样的字符串(对应于ip 32.33.34.35
,也注意空格)作为整数(在这个例子中对应539042339
)?
答案 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(' !"#')