Проблемы с COLLATE в PostgreSQL 12

Моя проблема:

Я работаю в Windows 10, и мой компьютер настроен на португальский язык (pt_BR);

Я создаю базу данных в PostgreSQL, где мне нужно, чтобы некоторые столбцы оставались на португальском языке, а другие — на en_US, а именно те, в которых хранятся числа и валюта. Мне нужно $ вместо R$ и 1000.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]: ОШИБКА: сопоставление "en_US" для кодировки "UTF8" не существует

В метаданных базы данных указана кодировка по умолчанию: UTF8 и Collate Portugal_Brazil.1252.

Он будет развернут у моего интернет-провайдера, который работает под управлением Linux.

Любые предложения будут ценны. Заранее спасибо.


person cmgpimenta    schedule 09.01.2020    source источник
comment
Мой первый пост здесь... почему без абзацев?   -  person cmgpimenta    schedule 10.01.2020
comment
collate для числового столбца вообще не имеет смысла   -  person a_horse_with_no_name    schedule 10.01.2020


Ответы (1)


Сопоставление определяет, как сравниваются строки. Это не применимо к числовым данным.

Более того, PostgreSQL использует параметры сортировки операционной системы, что вызывает проблемы при переносе базы данных из Windows в другие операционные системы. Сопоставление будет называться English в Windows и en_US.utf8 в операционных системах, использующих glibc.

Чтобы повлиять на форматирование чисел и символов валюты, установите параметры lc_numeric и lc_monetary соответствующим образом (English в Windows, en_US в других местах). Обратите внимание, что хотя lc_monetary влияет на строковое представление типа данных money, эти настройки не влияют на строковое представление чисел. Вам нужно использовать to_char следующим образом:

to_char(1000, '999G999G999D00 L');
person Laurenz Albe    schedule 10.01.2020
comment
Большое спасибо! Кажется, проблема была в том, что я использовал en_US вместо английского. Спасибо за ваш добрый и быстрый ответ. - person cmgpimenta; 13.01.2020