正常大家平时所见的IP地址通常是用点号(.)分割的四组数字,例如:192.168.0.100,但是做通信行业的朋友可能会比较习惯在数据库表中存储长整型(long)数字,以方便查询比较和节约存储。
如果采用这种方式,那么会经常遇到在点号分割传和长整型之间的转换,在Greenplum中,我们可以通过下面两个函数实现二者之间的轻松转换:
函数主体为:
CREATE OR REPLACE FUNCTION inet_aton(text)RETURNS bigint AS$BODY$SELECTsplit_part($1,'.',1)::int8*(256*256*256)+split_part($1,'.',2)::int8*(256*256)+split_part($1,'.',3)::int8*256+split_part($1,'.',4)::int8;$BODY$LANGUAGE sql VOLATILE;
CREATE OR REPLACE FUNCTION inet_ntoa(bigint)RETURNS text AS$BODY$SELECT (($1>>24) & 255::int8) || '.' ||(($1>>16) & 255::int8) || '.' ||(($1>>8) & 255::int8) || '.' ||($1 & 255::int8) as result$BODY$LANGUAGE sql VOLATILE;
使用演示:
postgres=# select inet_aton('192.168.100.107');inet_aton------------3232261227(1 row)postgres=# select inet_ntoa(3232261227);inet_ntoa-----------------192.168.100.107(1 row)