Postgres:无法从存储 json 数组数据的 bytea 列中提取数据

Postgres : Unable to extract data from a bytea column which stores json array data

我正在尝试从存储 JSON Postgres 11.9 版本数据的 bytea 列中提取数据。

但是,我的代码抛出错误:

错误:类型 json 的输入语法无效 详细信息:令牌“”无效。 上下文:JSON 数据,第 1 行:...

示例数据如下:

create table EMPLOYEE (PAYMENT bytea,NAME character varying);
insert into EMPLOYEE
  values ('[{"totalCode":{"code":"EMPLOYER_TAXES"},"totalValue":{"amount":122.5,"currencyCode":"USD"}},{"totalCode":{"code":"OTHER_PAYMENTS"},"totalValue":{"amount":0.0,"currencyCode":"USD"}},{"totalCode":{"code":"GROSS_PAY"},"totalValue":{"amount":1000.0,"currencyCode":"USD"}},{"totalCode":{"code":"TOTAL_HOURS"},"totalValue":{"amount":40.0}}]'::bytea,'Tom')
;

这是我的查询:

SELECT *    
 FROM EMPLOYEE left outer join lateral    
  jsonb_array_elements(PAYMENT::text::jsonb) element1 on true  ;

请帮助我访问这个数组中的数据。数据的格式始终为 JSON。 对此列使用 bytea 存在限制。

您将 JSON 值存储在 bytea 列中,这让您的生活变得不必要地艰难。仅仅因为这是 Oracle 中推荐的方式,并不意味着这对 Postgres 来说是一个不错的选择。

正确的解决方案是将该列更改为 jsonb。无论如何,您的应用程序中必须有一个 DBMS 特定层,因为您使用的实际函数和运算符非常不同。


话虽如此,您 可以 使用 convert_from() 方法摆脱这个可怕的选择:

select e.name, element1.*
from employee e
 left join lateral jsonb_array_elements(convert_from(PAYMENT, 'UTF-8')::jsonb) element1 on true;

我还认为您应该更改 INSERT 语句以执行从 textbytea 的显式转换,以便您可以确保使用了正确的编码:

insert into employee (payment, name)
values (convert_to('[{...}]', 'UTF-8'),'Tom');

但同样:唯一正确的解决方案是将该列更改为 jsonb(或至少 json