json - 优化 PostgreSQL 9.0 转义 JSON

标签 json postgresql query-optimization

我目前在 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/

相关文章:

mysql - 使用 "ORDER BY"进行简单的 SQL 查询需要花费 10-20 倍的时间

sql - 如何根据行类型获取每种类型的最新行并执行计算?

php - 将 html 页面存储到 php 变量中

postgresql - 通过 cmdbuild 安装 shark 工具的问题

mysql - 使用多个查询或 vs 联合多个查询,哪个会更快?

arrays - 如果数组包含给定范围内的值,则过滤行

ruby-on-rails - 值为字符串时表属性之和

javascript - 在 Java 中将 ANSI 转换为 UTF-8

json - 如何在 Swift 中解码 HTML 实体?

javascript - D3 - 按 id 选择