PostgreSQL 中 IPv4 地址的正确数据类型是什么?
听说过inet
,但没用过。
我需要执行SELECT
类似的查询SELECT ... WHERE ip = '99.88.99.88'
,它应该支持人类可读格式的输出(人类可读我的意思是'99.88.99.88')。
如果能够SELECT
通过那里的子网访问 IP 地址,那就太好了。
感谢您提前提出任何建议!
PostgreSQL 中 IPv4 地址的正确数据类型是什么?
听说过inet
,但没用过。
我需要执行SELECT
类似的查询SELECT ... WHERE ip = '99.88.99.88'
,它应该支持人类可读格式的输出(人类可读我的意思是'99.88.99.88')。
如果能够SELECT
通过那里的子网访问 IP 地址,那就太好了。
感谢您提前提出任何建议!
内置cidr
和inet
类型将做你想做的事并提供合适的运算符:
regress=> SELECT '192.168.1.19'::inet << '192.168.1.0/24'::cidr;
?column?
----------
t
(1 row)
请参阅有关网络数据类型运算符和函数以及网络数据类型的 PostgreSQL 文档。
cidr
为和inet
类型提供了有限的索引支持;特别是,“范围内的地址”类型查询至少在地址为常数的情况下会转换为范围查询。看到这个(相当旧的)线程。
另请参阅 Chris 的观点ip4r
。
http://www.postgresql.org/docs/current/static/datatype-net-types.html具有inet
类型字段它只是您需要的。
运算符 <<、<<=、>> 和 >>= 测试是否包含子网。
我想补充一点,内置类型非常强大,这就是您应该开始的地方。但是,如果您需要 GIN 索引,请查看http://pgfoundry.org/projects/ip4r/
如果您需要存储 CIDR 块并确保没有块包含任何其他块,则可能是 ip4r 的一个案例(我开始使用它的原因)。由于这需要 GIN 索引,因此您必须使用 ip4r 而不是内置类型。