如何消除pg_get_functiondef获取的函数定义换行差异,使SQL比较返回True
解决PostgreSQL函数定义换行符差异导致的比较不一致问题
问题根源是不同数据库中函数定义的换行符格式不同:有的是Windows风格的CRLF(八进制\015\012,对应十六进制\x0D\x0A),有的是Unix风格的LF(八进制\012,对应十六进制\x0A),文本内容一致但底层字节不同,导致=比较返回FALSE。
以下是在bytea层面消除差异的具体方法:
方法一:直接操作bytea替换换行符
通过嵌套replace函数,先把CRLF替换为LF,再清除剩余的单独CR,统一成Unix风格换行:
SELECT replace(replace(pg_get_functiondef(oid1)::bytea, '\x0D\x0A'::bytea, '\x0A'::bytea), '\x0D'::bytea, '\x0A'::bytea) = replace(replace(pg_get_functiondef(oid2)::bytea, '\x0D\x0A'::bytea, '\x0A'::bytea), '\x0D'::bytea, '\x0A'::bytea) AS are_equal;
方法二:先处理文本再转bytea
利用文本函数translate统一换行符后再转回bytea,效果和方法一一致:
SELECT translate(pg_get_functiondef(oid1), E'\r\n', E'\n')::bytea = translate(pg_get_functiondef(oid2), E'\r\n', E'\n')::bytea AS are_equal;
两种方法都能让内容一致但换行符格式不同的函数定义bytea比较返回TRUE。
内容的提问来源于stack exchange,提问作者sh4rkyy
相关产品推荐
相关产品推荐

