只有小于 1 的数字才能正确导出到 csv Postgresql

Only numbers less than 1 exported correctly to csv Postgresql

我想导出这个结果:

id weight ref_id multiplier cat
1     1,2     1B        1,4 380
2     0,8     1C          1 379

其中id为int8,weight和multiplier为numeric,ref_id为varchar(50),cat为int4。

问题是,当我导出到 csv 时,大于或等于 1 的权重和乘数值变成了千位数字,而其余的(在本例中为 0,8)保持不变(如我希望它是)。

如何解决这个问题才能使导出后的数字保持不变?

您正在处理区域设置问题。 CSV 数据使用 , 作为小数点分隔符,数据库使用的语言环境将 , 视为千位分隔符。要在 psql 中确认,请执行:show lc_numeric;。添加答案作为问题的更新。两种可能的解决方案 1) 将 CSV 数据中的 , 更改为 .。 2) 将数据导入到staging table,其中字段都是varchar。然后使用此处 Data formatting 中的 to_number 将传输中的数字转换为最终 table。这将涉及临时更改语言环境数字设置:


show lc_numeric;
 lc_numeric  
-------------
 en_US.UTF-8
select to_number('1,2', '9D9');
ERROR:  numeric field overflow
DETAIL:  A field with precision 1, scale 0 must round to an absolute value less than 10^1.

select to_number('1,2', '9G9');
 to_number 
-----------
        12

set lc_numeric = 'de_DE.UTF-8';
SET

production_(postgres)(5442)=# show lc_numeric;
 lc_numeric  
-------------
 de_DE.UTF-8

select to_number('1,2', '9D9');
 to_number 
-----------
       1.2