使用 pgAdmin 4 时将 bigint 错误地插入到 JSONB 列中
Incorrect insert of bigint into JSONB column when using pgAdmin 4
我在插入具有 bigint 字段的 jsonb 值时观察到奇怪的行为。根据文档 jsonb 支持数字数据类型,因此应该不是问题。
Table:
CREATE TABLE document_wrapper
(
id integer NOT NULL,
document jsonb NOT NULL,
CONSTRAINT document_pkey PRIMARY KEY (id)
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
样本插入:
insert into document_wrapper(id, document) values(-8, '{"id":101861191707868275}');
现在查询文档时:
SELECT document FROM document_wrapper;
给出结果(末尾注0):
{ "id": 101861191707868270 }
但是当我 select 它的实际 id 值时,它在所有这些情况下都是正确的:
SELECT
(document->'id')::text,
jsonb_extract_path_text(d.document, 'id') ,
(document #>> '{id}')::bigint,
(document->>'id')::numeric,
(document->'id')::bigint
FROM document_wrapper d
WHERE id = -8 ;
每种情况下的结果都是 101861191707868275。
为什么 json 中可见的值与最初插入的值不同?这会导致在将 json 发送到获取错误值的后端应用程序时出现问题。
Posgres 版本:
x86_64-pc-linux-gnu 上的 PostgreSQL 11.2,由 gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36) 编译,64 位
更新:代码通过 psql 工具正确运行。 pgAdmin 和应用程序(驱动程序 https://mvnrepository.com/artifact/org.postgresql/postgresql 版本 42.2.5)
中出现问题
所以问题实际上是 java-脚本。问题仅出现在 Web 应用程序(webapp pg_admin,应用程序前端)。通过 number extended js-es Number.MAX_SAFE_INTEGER 导致数字四舍五入。我愚蠢地相信后端 returns 基于在浏览器中查找的响应的错误数据(已经四舍五入)。
作为解决方法,我已将数字更改为字符串
我在插入具有 bigint 字段的 jsonb 值时观察到奇怪的行为。根据文档 jsonb 支持数字数据类型,因此应该不是问题。
Table:
CREATE TABLE document_wrapper
(
id integer NOT NULL,
document jsonb NOT NULL,
CONSTRAINT document_pkey PRIMARY KEY (id)
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
样本插入:
insert into document_wrapper(id, document) values(-8, '{"id":101861191707868275}');
现在查询文档时:
SELECT document FROM document_wrapper;
给出结果(末尾注0):
{ "id": 101861191707868270 }
但是当我 select 它的实际 id 值时,它在所有这些情况下都是正确的:
SELECT
(document->'id')::text,
jsonb_extract_path_text(d.document, 'id') ,
(document #>> '{id}')::bigint,
(document->>'id')::numeric,
(document->'id')::bigint
FROM document_wrapper d
WHERE id = -8 ;
每种情况下的结果都是 101861191707868275。
为什么 json 中可见的值与最初插入的值不同?这会导致在将 json 发送到获取错误值的后端应用程序时出现问题。
Posgres 版本: x86_64-pc-linux-gnu 上的 PostgreSQL 11.2,由 gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36) 编译,64 位
更新:代码通过 psql 工具正确运行。 pgAdmin 和应用程序(驱动程序 https://mvnrepository.com/artifact/org.postgresql/postgresql 版本 42.2.5)
中出现问题所以问题实际上是 java-脚本。问题仅出现在 Web 应用程序(webapp pg_admin,应用程序前端)。通过 number extended js-es Number.MAX_SAFE_INTEGER 导致数字四舍五入。我愚蠢地相信后端 returns 基于在浏览器中查找的响应的错误数据(已经四舍五入)。
作为解决方法,我已将数字更改为字符串