PostgreSQL中JSON数据类型的大小限制

ank*_*oni 46 postgresql json postgresql-9.2

有谁知道PostgreSQL 9.2中JSON数据类型的大小限制是什么?

j.w*_*w.r 73

查看PostgreSQL 9.2.1的源代码:

Source: postgresql-9.2.1\src\backend\utils\adt\json.c:
/*
 * Input.
 */
Datum
json_in(PG_FUNCTION_ARGS)
{
    char       *text = PG_GETARG_CSTRING(0);

    json_validate_cstring(text);

    /* Internal representation is the same as text, for now */
    PG_RETURN_TEXT_P(cstring_to_text(text));
}
Run Code Online (Sandbox Code Playgroud)

PostgreSQL 9.3.5的更新:

代码在json_in函数中已更改,但json内部表示仍为文本:

Source: postgresql-9.3.5\src\backend\utils\adt\json.c:
/*
 * Input.
 */
Datum
json_in(PG_FUNCTION_ARGS)
{
    char       *json = PG_GETARG_CSTRING(0);
    text       *result = cstring_to_text(json);
    JsonLexContext *lex;

    /* validate it */
    lex = makeJsonLexContext(result, false);
    pg_parse_json(lex, &nullSemAction);

    /* Internal representation is the same as text, for now */
    PG_RETURN_TEXT_P(result);
}
Run Code Online (Sandbox Code Playgroud)

因此,至少现在似乎jsontext数据类型相同,但使用JSON验证.该text数据类型的最大大小为1GB.

  • @edencorbin它是1024 MB :) (17认同)
  • (post以来的新帖子?)Postgres`jsonb`数据类型是否使用纯文本以外的东西? (12认同)
  • @localhostdotdev:如果您尝试创建一个大的 `jsonb` 值,您很容易会遇到错误消息:“*jsonb 对象元素的总大小超过了 268435455 字节的最大值*”,这意味着 `jsonb` 确实有 256MB 的限制,不是 1GB (9认同)
  • 1GB!这很不错.很高兴这个数字不是MB. (5认同)
  • 从技术上讲,MB (MegaByte) 是 1000,MiB (MebiByte) 是 1024,但每个人都使用 MB (MegaByte) 来指代 1024 (2认同)

Moh*_*eid 26

对于jsonb字段,如果您查看源代码中的jsonb.c,您会看到这个函数:

checkStringLen(size_t len)
{
    if (len > JENTRY_OFFLENMASK)
        ereport(ERROR,
                (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
                 errmsg("string too long to represent as jsonb string"),
                 errdetail("Due to an implementation restriction, jsonb strings cannot exceed %d bytes.",
                           JENTRY_OFFLENMASK)));

    return len;
}

Run Code Online (Sandbox Code Playgroud)

错误代码表示 jsonb 字符串不能超过JENTRY_OFFLENMASK字节。

jsonb.h 中,该常量定义为:

#define JENTRY_OFFLENMASK       0x0FFFFFFF
Run Code Online (Sandbox Code Playgroud)

这是255 MB

我在 PostgreSQL 9.4 到 13 的源代码中检查了这一点。

  • 因为 jsonb != json (11认同)
  • 不确定接受的答案是否声称 1GB ,但我昨天遇到了这个确切的错误。我的 json 大小只有 300Mb 多一点。 (5认同)