首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在PostgreSQL中如何处理Unicode序列?

在PostgreSQL中如何处理Unicode序列?
EN

Stack Overflow用户
提问于 2018-03-07 04:12:01
回答 2查看 0关注 0票数 0

我在PostgreSQL数据库(9.4.1)的JSON(而不是JSONB)列中存储了一些JSON数据。其中一些JSON结构在属性值中包含Unicode序列。例如:

代码语言:txt
复制
{"client_id": 1, "device_name": "FooBar\ufffd\u0000\ufffd\u000f\ufffd" }

当我试图查询这个JSON列时(即使我没有直接尝试访问device_name属性)时,将得到以下错误:

ERROR: unsupported Unicode escape sequence

Detail:\u0000cannot be converted to text.

可以通过在PostgreSQL服务器上执行以下命令重新创建此错误:

代码语言:txt
复制
select '{"client_id": 1, "device_name": "FooBar\ufffd\u0000\ufffd\u000f\ufffd" }'::json->>'client_id'

这个错误对我来说是有意义的--根本就没有方法来表示unicode序列。NULL在文本结果中。

我是否有任何方法可以查询相同的JSON数据,而不必对传入的数据执行“sanitation”操作?

EN

回答 2

Stack Overflow用户

发布于 2018-03-07 12:58:46

\u0000在字符串中无效的一个Unicode代码点。

json只是一个特定格式的字符串,您可以使用标准的字符串函数,而不必担心JSON结构:

代码语言:txt
复制
SELECT (regexp_replace(the_string::text, '\\u0000', '', 'g'))::json;
票数 0
EN

Stack Overflow用户

发布于 2018-03-07 13:41:02

首先,我可以通过书写来再现错误:

代码语言:txt
复制
select json '{ "a":  "null \u0000 escape" }' ->> 'a' as fails

然后,我添加了一个自定义函数,用于查询:

代码语言:txt
复制
CREATE OR REPLACE FUNCTION null_if_invalid_string(json_input JSON, record_id UUID)
  RETURNS JSON AS $$
DECLARE json_value JSON DEFAULT NULL;
BEGIN
  BEGIN
    json_value := json_input ->> 'location';
    EXCEPTION WHEN OTHERS
    THEN
      RAISE NOTICE 'Invalid json value: "%".  Returning NULL.', record_id;
      RETURN NULL;
  END;
  RETURN json_input;
END;
$$ LANGUAGE plpgsql;

要调用该函数,请执行以下操作。您不应该收到错误。

代码语言:txt
复制
select null_if_invalid_string('{ "a":  "null \u0000 escape" }', id) from my_table

而这应该会像预期的那样返回JSON:

代码语言:txt
复制
select null_if_invalid_string('{ "a":  "null" }', id) from my_table
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档