PostgreSQL на Windows 10. Локаль не работает - PullRequest
0 голосов
/ 26 сентября 2019

Я установил PostgreSQL версии 11 на ПК с Windows 10 два раза.Первый раз это был официальный установщик для Windows, второй раз это был набор пакетов для cygwin.

Проблема в том, что я не могу заставить работать какие-либо настройки языкового стандарта базы данных.В любом из двух приведенных выше случаев кластер Postgres был инициализирован командой initdb.

При установке cygwin команда имеет -E UTF8, --locale=uk_UA.utf8 и то же самое для collation и ctypes.cygwin, казалось, распознал команду, кластер был создан.Затем я создал базу данных с соответствующими настройками и несколькими таблицами в ней.

Вывод простого запроса был явно неверным для моей локали.Это был знак $ вместо грн для денежной единицы, . для , для дробной части и так далее.Официальный установщик дал те же результаты, локаль настроена и отображается правильно.

То же initdb и create database дают мне правильные результаты с linux OS.

initdb

initdb —pgdata=... \
          —locale=uk_UA.utf8
          —lc-collate=...
          —lc-type=...
          —lc-monetary=...
          —lc-numeric=...
          —lc-time=...
          —encoding=UTF-8

Здесь, в основном, я повторил локаль uk_UA.utf8.Также пробовал с языком «uk-x-icu», так как версия для Windows скомпилирована с библиотекой icu, как кажется.

Запросы

create database db
 template         = template0
 encoding         = 'UTF8'
 lc_collate       = 'uk_UA.utf8'
 ...              = 'uk_UA.utf8'
 lc_ctype         = 'uk_UA.utf8'
 connection_limit = -1
 is_template      = false
;

create table c_types (
 id           serial,
 c_date       date,
 c_text       text,
 c_time       time,
 c_timestamp  timestamp,
 c_money      money,
 c_float      float
);

insert into c_types(c_date,c_text,c_time,c_timestamp,c_money,c_float) values
('2019-09-01', 'text0', '00:00:01', timestamp '2019-09-01 20:00:00', 1000.0001, 1000.0001),
('2019-09-01', 'text1', '00:00:02', timestamp '2019-09-01 21:00:00', 2000.0001, 2000.0001)
;

select * from c_types;

Правильный вывод (Linux)

# id |   c_date   | c_text |  c_time  |     c_timestamp     |    c_money    |  c_float  
#----+------------+--------+----------+---------------------+---------------+-----------
#  1 | 2019-09-01 | text0  | 00:00:01 | 2019-09-01 20:00:00 |  1 000,00грн. | 1000.0001
#  2 | 2019-09-01 | text1  | 00:00:02 | 2019-09-01 21:00:00 |  2 000,00грн. | 2000.0001

В этом посте показано, что lc_numeric не влияет на разделитель в числовых значениях, как https://stackoverflow.com/a/41759744/8339821

Влияет на функции to_number, to_char и т. Д. https://stackoverflow.com/a/8935028/8339821

Вопрос в том, как настроить Postgres для моей локали?

...