PostgreSQL查询172.24.12.xxx段IP失败,求排查错误原因
问题分析与解决方案
你的核心错误是混淆了正则表达式语法和PostgreSQL inet类型的输入规则:
inet类型仅接受合法的IP地址或CIDR网段格式(比如172.24.12.0/24),不支持正则表达式字符串直接转换。你写的(?|172\.24\.12\.)这类正则语法,对inet类型来说是完全无效的输入,因此触发语法错误。- 你试图用正则逻辑来匹配IP网段,但PostgreSQL对IP类型有原生的网段匹配能力,不需要用正则绕路。
正确的实现方式
方法1:使用CIDR网段匹配(推荐,性能最优)
172.24.12.xxx对应的标准CIDR网段是172.24.12.0/24,可以用PostgreSQL内置的<<=操作符判断IP是否属于该网段:
-- 查询不属于172.24.12.0/24网段的连接 SELECT * FROM pg_catalog.pg_stat_activity WHERE NOT (client_addr <<= '172.24.12.0/24');
方法2:字符串正则匹配(仅特殊场景使用)
如果一定要用正则,需要先把client_addr转换为字符串类型,再用正则匹配:
SELECT * FROM pg_catalog.pg_stat_activity WHERE client_addr::text !~ '^172\.24\.12\.';
注意:方法2的性能远低于方法1,因为会触发全表类型转换,无法利用
client_addr上的索引(如果有的话),生产环境优先用方法1。
内容的提问来源于stack exchange,提问作者Marcio Lino
相关产品推荐
相关产品推荐

