9

PostgreSQL 中 IPv4 地址的正确数据类型是什么?

听说过inet,但没用过。

我需要执行SELECT类似的查询SELECT ... WHERE ip = '99.88.99.88',它应该支持人类可读格式的输出(人类可读我的意思是'99.88.99.88')。

如果能够SELECT通过那里的子网访问 IP 地址,那就太好了。

感谢您提前提出任何建议!

4

3 回答 3

17

内置cidrinet类型将做你想做的事并提供合适的运算符:

regress=> SELECT '192.168.1.19'::inet << '192.168.1.0/24'::cidr;
 ?column? 
----------
 t
(1 row)

请参阅有关网络数据类型运算符和函数以及网络数据类型的 PostgreSQL 文档。

cidr为和inet类型提供了有限的索引支持;特别是,“范围内的地址”类型查询至少在地址为常数的情况下会转换为范围查询。看到这个(相当旧的)线程

另请参阅 Chris 的观点ip4r

于 2013-03-13T11:42:08.013 回答
4

http://www.postgresql.org/docs/current/static/datatype-net-types.html具有inet类型字段它只是您需要的。

运算符 <<、<<=、>> 和 >>= 测试是否包含子网。

于 2013-03-13T11:39:52.600 回答
4

我想补充一点,内置类型非常强大,这就是您应该开始的地方。但是,如果您需要 GIN 索引,请查看http://pgfoundry.org/projects/ip4r/

如果您需要存储 CIDR 块并确保没有块包含任何其他块,则可能是 ip4r 的一个案例(我开始使用它的原因)。由于这需要 GIN 索引,因此您必须使用 ip4r 而不是内置类型。

于 2013-03-13T12:32:37.663 回答