CREATE OR REPLACE FUNCTION escape_Json(i_text TEXT) RETURNS TEXT AS$body$ DECLARE IDx INTEGER; text_len INTEGER; cur_char_unicode INTEGER; rtn_value TEXT := i_text;BEGIN -- $Rev: $-- text_len = LENGTH(rtn_value); IDx = 1; WHILE (IDx <= text_len) LOOP cur_char_unicode = ASCII(SUBSTR(rtn_value,IDx,1)); IF cur_char_unicode > 255 THEN rtn_value = OVERLAY(rtn_value PLACING (E'\u' || LPAD(UPPER(TO_HEX(cur_char_unicode)),4,'0')) FROM IDx FOR 1); IDx = IDx + 5; text_len = text_len + 5; ELSE /* is the current character one of the following: " \ / bs ff nl cr tab */ IF cur_char_unicode IN (34,92,47,8,12,10,13,9) THEN rtn_value = OVERLAY(rtn_value PLACING (E'\' || (CASE cur_char_unicode WHEN 34 THEN '"' WHEN 92 THEN E'\' WHEN 47 THEN '/' WHEN 8 THEN 'b' WHEN 12 THEN 'f' WHEN 10 THEN 'n' WHEN 13 THEN 'r' WHEN 9 THEN 't' END) ) FROM IDx FOR 1); IDx = IDx + 1; text_len = text_len + 1; END IF; END IF; IDx = IDx + 1; END LOOP; RETURN rtn_value;END;$body$LANGUAGE plpgsql;我所有的方法归结为“以其他方式做”:
>用其他语言写,例如使用pl / perl,pl / python,pl / ruby
>编写一个用C编写的外部JsON库的包装器
> JsON是否在客户端而不是在查询中转义(假设您的客户端具有一些良好的JsON转义支持)
根据我的经验,pl / pgsql在这种情况下并不快 – 它的优势在于它与数据库交换数据的整体支持,而不是作为通用编程语言.
例:
create or replace function escape_Json_perl(text) returns text strict immutable language plperlu as $$ use JsON; return JsON->new->allow_nonref->encode($_[0]); $$;
快速测试表明这比plpgsql函数快15倍(虽然它返回你可能想要剥离的值的引号)
总结以上是内存溢出为你收集整理的在PostgreSQL 9.0中优化转义JSON全部内容,希望文章能够帮你解决在PostgreSQL 9.0中优化转义JSON所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)