我将 ip 地址保存为字符串,使用 phpinet_pton
作为四字节字符串。要使用 mysql 创建人类可读的表示,我想使用inet_ntoa
MySQL,但是,它似乎只接受整数值。
那么,我如何将一个字符串!"#
(对应于 ip 32.33.34.35
,还要注意空格)读取为整数(对应539042339
于本例中)?
我将 ip 地址保存为字符串,使用 phpinet_pton
作为四字节字符串。要使用 mysql 创建人类可读的表示,我想使用inet_ntoa
MySQL,但是,它似乎只接受整数值。
那么,我如何将一个字符串!"#
(对应于 ip 32.33.34.35
,还要注意空格)读取为整数(对应539042339
于本例中)?
您可以使用某些东西Hex()
将字符串转换为十六进制,然后Conv()
将其转换为基数 10。
SELECT inet_ntoa(conv(hex(' !"#'), 16, 10))
使用 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(' !"#')