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

87

有人知道PostgreSQL 9.2中JSON数据类型的大小限制吗?

2个回答

107

查看 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


14
PostgreSQL的jsonb数据类型(自发布以来)是否使用了除纯文本之外的其他内容? - Nick T
8
1GB! 非常不错。很高兴这个数字不是以MB为单位的。 - edencorbin
30
@edencorbin,它是1024 MB :) - Olim Saidov
4
技术上说,MB(兆字节)是1000,而MiB(MebiByte)是1024,但是大家都使用MB(兆字节)来表示1024。 - Jordan Davidson
8
如果你尝试创建一个大的 jsonb 值,你很容易会遇到这个错误信息: "total size of jsonb object elements exceeds the maximum of 268435455 bytes",这意味着 jsonb 确实有一个256MB的限制,而不是1GB。 - user330315
显示剩余2条评论

62
对于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 至 15 的源代码中进行了检查。


5
不确定接受的答案声称1GB是否正确,但昨天我遇到了完全相同的错误。我的JSON文件大小略大于300MB。 - Tejas Kale
19
因为jsonb不等于json。 - fjsj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接