【问题标题】:Problems with COLLATE in PostgreSQL 12PostgreSQL 12 中的 COLLATE 问题
【发布时间】:2020-04-27 14:40:52
【问题描述】:

我的问题:

我在 Windows 10 中工作,我的计算机设置为葡萄牙语 (pt_BR);

我正在 PostgreSQL 中构建一个数据库,其中我需要某些列保留为葡萄牙语,但其他列保留为 en_US - 即那些存储数字和货币的列。我需要 $ 而不是 R$ 和 1,000.00 而不是 1.000,00。

我尝试使用 COLLATE 语句以这种方式创建列,如下所示:

CREATE TABLE crm.TESTE (
    prodserv_id varchar(30) NOT NULL,
    prodserv_name varchar(140) NULL,
    fk_prodservs_rep_acronym varchar(4) NULL,
    prodserv_price numeric null collate "en_US",
    CONSTRAINT pk_prodservs_prodserv_id PRIMARY KEY (prodserv_id)
);

但我收到错误消息:

SQL 错误 [42704]:错误:用于编码“UTF8”的排序规则“en_US”不存在

数据库元数据显示默认编码:UTF8 和 Collat​​e Portugal_Brazil.1252

它将部署在我的运行 Linux 的 ISP 上。

任何建议将不胜感激。 提前致谢。

【问题讨论】:

  • 我在这里的第一篇文章...为什么没有段落?
  • collate 对于数字列根本没有意义

标签: postgresql collate


【解决方案1】:

排序规则定义如何比较字符串。不适用于数值数据。

此外,PostgreSQL 使用操作系统的排序规则,这在将数据库从 Windows 移植到其他操作系统时会导致问题。排序规则在 Windows 上称为 English,在使用 glibc 的操作系统上称为 en_US.utf8

要影响数字和货币符号的格式,请适当设置lc_numericlc_monetary 参数(Windows 上为English,其他地方为en_US)。请注意,虽然lc_monetary 会影响money 数据类型的字符串表示,但这些设置不会影响数字的字符串表示。你需要像这样使用to_char

to_char(1000, '999G999G999D00 L');

【讨论】:

  • 非常感谢!看来问题是我使用了 en_US 而不是英语。感谢您的及时回复。
猜你喜欢
  • 2021-05-25
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多