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

Posted

技术标签:

【中文标题】PostgreSQL 中 JSON 数据类型的大小限制【英文标题】:Size limit of JSON data type in PostgreSQL 【发布时间】:2012-09-28 02:37:44 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

Postgres jsonb 数据类型是否使用纯文本以外的其他内容? 1GB!这很好。很高兴这个数字不是以 MB 为单位。 @edencorbin 它是 1024 MB :) 不是 1000 mb 吗? ;) 技术上一个MB(MegaByte)是1000,一个MiB(MebiByte)是1024,但是每个人都用MB(MegaByte)来指代1024【参考方案2】:

对于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 的源代码中检查了这一点。

【讨论】:

不确定声称 1GB 的已接受答案,但我昨天遇到了这个确切的错误。我的 json 文件大小只有 300Mb 多一点。 因为 jsonb != json

以上是关于PostgreSQL 中 JSON 数据类型的大小限制的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Postgresql 中添加、更新和删除 Json 数据类型?

将 json 对象存储到 postgresql 中的数据类型是啥?

如何修改新 PostgreSQL JSON 数据类型中的字段?

如何在 laravel 中获取 PostgreSQL 的 JSON 类型数据?

在 Flask-sqlalchemy 和 Postgresql 中使用 JSON 类型

Sequelize:在 PostgreSQL 的 JSON 数据类型上使用 $like