67

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

4

2 回答 2

92

查看 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));
}

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);
}

因此,至少目前看来,它与数据类型json相同,text但具有 JSON 验证。数据类型的text最大大小为1GB

于 2012-09-28T03:23:47.143 回答
35

对于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;
}

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

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

#define JENTRY_OFFLENMASK       0x0FFFFFFF

这是255 MB

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

于 2020-02-04T13:57:48.383 回答