我有一个PostgreSQL函数,它接受JSON,执行一些处理,并返回JSON。从Java appication调用存储过程时发生了一些奇怪的事情 - float->字符串转换不正确。
处理主要是过滤数据并返回重组和重组结果。为简单起见,我们假设输入为地图[name->float]
,输出为[float]
。
问题是在中间数据存储期间将值存入本机PostgreSQL数据类型浮点值会丢失精度/准确度/格式。
以下是重现的代码
CREATE OR REPLACE FUNCTION do_dummy()
RETURNS void LANGUAGE plpgsql AS $$
DECLARE
v_float float[];
v_json jsonb;
v_str varchar;
BEGIN
v_float[0] = 4.1;
raise notice 'v_float = %', v_float[0];
raise notice 'jsonb float -> %', ('{"v": 4.1}'::jsonb)->'v';
raise notice 'jsonb float ->> %', ('{"v": 4.1}'::jsonb)->>'v';
v_float[0] = ('{"v": 4.1}'::jsonb)->>'v';
raise notice 'jsonb float ->>::float %', v_float[0];
v_json = array_to_json(v_float);
raise notice 'jsonb: %', v_json;
v_str = concat('jsonb as string: ', v_json::varchar);
raise notice '%', v_str;
END $$
执行时
select do_dummy();
...通过pgAdmin,输出跟随并且符合预期:
NOTICE: v_float = 4.1
NOTICE: jsonb float -> 4.1
NOTICE: jsonb float ->> 4.1
NOTICE: jsonb float ->>::float 4.1
NOTICE: jsonb: [4.1]
NOTICE: jsonb as string: [4.1]
从Java应用程序执行相同操作时,结果如下:
NOTICE: v_float = 4.0999999999999996
NOTICE: jsonb float -> 4.1
NOTICE: jsonb float ->> 4.1
NOTICE: jsonb float ->>::float 4.0999999999999996
NOTICE: jsonb: [4.0999999999999996]
NOTICE: jsonb as string: [4.0999999999999996]
由于在函数调用中没有数据传输到服务器/从服务器传输 - 问题完全发生在服务器端,但JDBC驱动程序中的某些内容正在触发问题。
在这方面JDBC连接有什么问题?
我正在使用jdbc驱动程序v9.4.1207(目前最新的驱动程序)。
答案 0 :(得分:0)