只有小于 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
我想导出这个结果:
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