我目前在 PostgreSQL 中使用这个 JSON 转义函数作为 future 原生 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;
最佳答案
自白:我是 Google Summer of Code 2010 的学生,我打算尝试将 JSON 支持引入 PostgreSQL 9.1。尽管我的代码功能相当齐全,但还没有完全准备好上游,PostgreSQL 开发社区正在寻找一些替代实现。然而,随着春假的临近,我希望能在本周完成我的重写并进行最后的插入。
与此同时,您可以下载并安装 work-in-progress JSON data type module ,它应该适用于 PostgreSQL 8.4.0 及更高版本。它是一个 PGXS 模块,因此您无需编译所有 PostgreSQL 即可编译和安装它。但是,您将需要 PostgreSQL 服务器开发 header 。
安装过程是这样的:
git clone git://git.postgresql.org/git/json-datatype.git
cd json-datatype/
USE_PGXS=1 make
sudo USE_PGXS=1 make install
psql -f json.sql <DBNAME1> # requires database superuser privileges
虽然构建和安装只需要完成一次,json.sql
需要在您计划使用 JSON 数据类型的每个数据库上运行。
安装后,您现在可以运行:
=> SELECT to_json(E'"quotes and \n newlines"\n'::TEXT);
to_json
--------------------------------
"\"quotes and \n newlines\"\n"
(1 row)
请注意,这不会转义非 ASCII 字符。
关于json - 优化 PostgreSQL 9.0 转义 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4995945/