Postgres 如何插入带小数逗号的实数?

问题描述 投票:0回答:1

我的数据库是带有 en_US UTF-8 语言环境的 postgres v14 数据库。我必须导入许多 .csv 文件,它们通常有实数小数点 (3.14),有时有小数点逗号 (3,14)。我的问题:有没有办法设置 postgres 以使数据正确读入 postgres?

我做了什么:我知道数据是否有小数点或逗号。在 pandas 中,通过设置语言环境,解决方案相当优雅,例如:

# test for decimal point, set locale accordingly
decimaal_teken = meta_data.iloc[0].loc['bronbestand_decimaal']
if decimaal_teken == '.':
    logger.warning(f'Floating point met decimale punt')
    locale.setlocale(locale.LC_NUMERIC, 'en_EN.utf8')

elif decimaal_teken == ',':
    logger.warning(f'Floating point met decimale komma')
    locale.setlocale(locale.LC_NUMERIC, 'en_DK.utf8')

else:
    logger.warning(f'Onbekend decimaal teken: "{decimaal_teken}", decimale punt wordt gebruikt')
    locale.setlocale(locale.LC_NUMERIC, 'en_EN.utf8')

我正在 postgres 中寻找类似的解决方案,但我找不到它。我有一个测试文件,如下所示:

SET lc_numeric = 'en_DK';
-- SET DECIMALSEPARATORCOMMA=ON;

INSERT INTO public.floats (naam, value)
VALUES
('Drente', '112,5');

我通过 -f 或 \i 将文件导入 psql 中。在这两种情况下,都会出现 112,5 不是有效实数的错误。 112.5 已接受。

我在这篇文章中找到的 DECIMALCOMMASEPARATOR 在 psql 中导入文件时会产生错误。我也将 linux 语言环境设置为 en_DK 但没有成功。

我可以用点替换逗号,但我想保持数据不变。我无法想象 postgres 对此没有解决方案。有人可以帮我指出一些我忽略的信息吗?

提前谢谢您!

postgresql decimal-point
1个回答
1
投票

数字文字始终必须使用小数点,无论

lc_numeric
如何设置。此参数仅影响
D
:
 解释格式字母 
to_numeric()

(以及其他)的方式
SELECT to_number('112,5', '990D99');

 to_number 
═══════════
     112.5
(1 row)

您可以将其与

INSERT
一起使用,但无法与
COPY
一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.