我在插入具有bigint字段的jsonb值时观察到奇怪的行为。根据doc,jsonb支持数字数据类型,因此应该不成问题。
表格:
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 }
但是当我从中选择实际的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)中出现问题
答案 0 :(得分:0)
所以问题实际上是Java脚本。仅在Web应用程序(webapp pg_admin,应用程序前端)中出现的问题。传递了数字扩展js-es Number.MAX_SAFE_INTEGER,导致数字被舍入。我很傻,我相信后端会根据浏览器(已经四舍五入)中查找到的响应返回错误数据。
作为解决方法,我已将数字更改为字符串