【问题标题】:How does the locale setting LC_NUMERIC work in PostgreSQL?区域设置 LC_NUMERIC 在 PostgreSQL 中如何工作?
【发布时间】:2012-02-14 13:38:16
【问题描述】:

谁能提供有关 PostgreSQL 中的语言环境和数字类型行为的见解?我们使用意大利语言环境。那是小数部分的逗号分隔。设置在postgresql.conf

# These settings are initialized by initdb, but they can be changed.
lc_messages = 'it_IT.UTF-8'                     # locale for system error message
                                                # strings
lc_monetary = 'it_IT.UTF-8'                     # locale for monetary formatting
lc_numeric = 'it_IT.UTF-8'                      # locale for number formatting
lc_time = 'it_IT.UTF-8'                         # locale for time formatting

.. 什么都不做!它以非常合适的方式处理日期等,但数字类型仍以 DOT 分隔小数部分。

root@server:~# uname -a
Linux server 2.6.32-36-generic-pae #79-Ubuntu SMP Tue Nov 8 23:25:26 UTC 2011 i686 GNU/Linux

root@server:~# dpkg -l | grep postgresql
ii  postgresql-8.4      8.4.9-0ubuntu0.10.04   object-relational SQL database, version 8.4 
ii  postgresql-client   8.4.9-0ubuntu0.10.04   front-end programs for PostgreSQL (supported)

编辑

在不同范围内实现语言环境时遇到问题:数据库、服务器脚本、操作系统和客户端。 决定避免使用任何区域设置格式并使用 en_EN 区域设置。区域设置格式将仅在输出时应用等。

【问题讨论】:

    标签: php postgresql locale


    【解决方案1】:

    我引用manual

    lc_numeric(字符串)

    设置用于格式化数字的语言环境,例如使用 to_char 系列函数。

    关注这些type formatting functions。您应该能够重现以下演示:

    SHOW lc_numeric;
    

    de_AT.UTF-8

    SELECT to_number('13,4','999D99')
    

    13.4

    SELECT to_char(13.4,'FM999D99')
    

    13,4

    SET lc_numeric = 'C';
    SELECT to_number('13,4','999D99')
    

    134

    SELECT to_char(13.4,'FM999D99')
    

    13.4

    RESET lc_numeric;
    

    Template patterns in the manual.

    SQL 表达式中的数字格式不会随区域设置而改变。那太疯狂了。


    另外说明:您知道在更改postgresql.conf 后必须(至少)重新加载服务器。

    pg_ctl reload
    

    【讨论】:

    • 感谢您的回答!是的,我知道 to_char 和其他方法以及服务器在配置更改时重新加载。但是短语“for example with the to_char”是什么意思?是否可以自动转换每个 SELECT 查询以尊重语言环境设置,即使以性能为代价?
    • @Igor:我可以完成,但疯狂潜伏在这条路上。它可能会破坏使用强制转换并更改语言环境的每一段代码。所以它只适用于使用区域感知模板模式的类型格式化函数。您可以在我包含的链接中找到这些列表。
    • 一旦你踏上计算机路径,你就已经走上了疯狂的道路,所以或多或少不会有太大的变化;)实际上我正在寻找避免疯狂,因为在这种情况下有可能在数据库部分实现它,我必须在代码中实现它,这肯定是错误!另一种可能性,用你的话来说是非常疯狂的,是通过视图来筛选表格并在它们的内部进行投射(甚至想避免这个)。
    猜你喜欢
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多