在PostgreSQL 9.0中优化转义JSON
发布时间:2020-12-13 18:09:18 所属栏目:百科 来源:网络整理
导读:我目前在PostgreSQL中使用这个 JSON转义函数作为未来原生 JSON支持的代表.虽然它有效,但它也限制了我们的系统性能.我该如何进行优化呢?也许某种查找数组? CREATE OR REPLACE FUNCTION escape_json(i_text TEXT) RETURNS TEXT AS$body$ DECLARE idx INTEGER
我目前在PostgreSQL中使用这个
JSON转义函数作为未来原生
JSON支持的代表.虽然它有效,但它也限制了我们的系统性能.我该如何进行优化呢?也许某种查找数组?
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 根据我的经验,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倍(虽然它返回你可能想要剥离的值的引号) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |