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

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

【问题讨论】:

    标签: json postgresql postgresql-9.2


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多