【问题标题】:Postgres lc_numeric not working as expectedPostgres lc_numeric 未按预期工作
【发布时间】:2017-01-20 17:05:31
【问题描述】:

我的项目涉及使用丹麦数字设置的数据库(小数点分隔符是逗号)。我试图弄清楚如何将数据库中的值存储为十进制/数字/除文本之外的任何内容,但让它们保留逗号分隔符。我已将 AWS 参数组中的 lc_numeric 设置更新为 da_DK,我在网上发现它是丹麦语区域设置,但值仍然显示为句点而不是小数点。需要做出哪些改变/这可能吗?

例如:

CREATE TABLE test ( 
    num NUMERIC 
);                             // I've also tried Decimal instead of numeric

INSERT INTO test ('1,3')       // error 
INSERT INTO test ('1.3')       // returns 1.3 when selected.
SHOW lc_numeric                // returns da_DK as expected.
SELECT * FROM test;            // 1.3

我做错了什么?

注意:这是通过 AWS RDS 的 postgres 实例,任何更改都需要通过参数组菜单进行,而不是通过命令行进行。

【问题讨论】:

  • lc_numeric 不会改变 SQL 接受数字作为 input 的方式。您可以更改 函数 to_number 使用小数分隔符和千位分隔符的方式。我认为没有任何方法可以改变数字的 input 方式(这通常在应用程序的用户界面部分完成,而不是在数据库中完成)。检查stackoverflow.com/questions/8933782/…
  • 坦率地说,我认为这是一个错误;我们也应该尊重 LC_NUMERIC 的输入,或者根本不支持它。不能往返数字表示是非常可怕的。
  • @CraigRinger 我不这么认为。 to_char 和 to_number 都尊重lc_numeric,而类型输入和输出函数则不尊重。因此,只要您不混音,“往返”就应该没问题,例如to_char(3.14, '99D99')::double precision。
  • @CraigRinger 那么数字文字呢?尊重lc_numeric 的解析器是否应该允许这样做? INSERT INTO test (1,3)(又名。插入单个数字1.3)。显然,这永远不会发生,但允许 numeric '1,3' 会产生奇怪的差异恕我直言。但是,来自字符串类型的CAST-ing 是另一种情况。它可能尊重lc_numeric。
  • 两者都好。

标签: postgresql amazon-web-services locale


【解决方案1】:

lc_numeric不影响数字类型的字符串输入输出格式,所以也不影响类型转换的结果。

它只影响转换函数to_char 和to_number。关于小数点分隔符,lc_numeric 决定了D 格式说明符的含义。

【讨论】:

  • 我不这么认为——你有例子吗?我经常使用de_DE.UTF8,但在psql 中还没有看到小数点逗号。
  • 我不使用 psql - 只是认为它会(但显然我错了)
猜你喜欢
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2022-01-24
相关资源
最近更新 更多