有人知道PostgreSQL 9.2中JSON数据类型的大小限制吗?
有人知道PostgreSQL 9.2中JSON数据类型的大小限制吗?
查看 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。
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 的源代码中进行了检查。
jsonb
数据类型(自发布以来)是否使用了除纯文本之外的其他内容? - Nick Tjsonb
值,你很容易会遇到这个错误信息: "total size of jsonb object elements exceeds the maximum of 268435455 bytes",这意味着jsonb
确实有一个256MB的限制,而不是1GB。 - user330315