Я установил 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 для моей локали?