`Initdb` в PostgreSQL завершается с ошибкой" неверные настройки локали; проверьте переменные среды LANG и LC_ * " - PullRequest
0 голосов
/ 07 июня 2018

Уже нашли решение для этого ( см. Ответ ниже ), но я не уверен, что оно подходит;плюс это может помочь кому-то еще.


Попытался настроить PostgreSQL, следуя документации ( 18.2 Создание кластера базы данных ), но получил следующую ошибку в Ubuntu 18.04 (ядро: 4.15.0-22-generic):

$ initdb -D /usr/local/pgsql/data
  (...)
initdb: invalid locale settings; check LANG and LC_* environment variables 

Нашел пару ответов по Stackoverflow ( 1 , 2 ), которые были актуальны, но они этого не сделалирешите проблему, и на Serverfault предложили перезапустить службу, но PostgreSQL даже не работал.

Попытка явно передать языковой стандарт в каждом варианте, обнаруженном в системе, ноони тоже не сработали,

 3617  2018/06/07-08:36 initdb -D ~/Downloads/ --locale=en_US.utf8
 3618  2018/06/07-08:36 initdb -D ~/Downloads/ --locale=en_US.UTF8
 3621  2018/06/07-08:37 initdb -D ~/Downloads/ --locale=en_US.UTF-8
 3622  2018/06/07-08:37 initdb -D ~/Downloads/ --locale="en_US.UTF-8"
 3623  2018/06/07-08:37 initdb -D ~/Downloads/ --locale="en_US.utf8"
 3645  2018/06/07-09:24 initdb -D ~/Downloads/ --locale="en_US.utf8"

с

initdb: invalid locale name <the_option_value_above>

На форуме Arch Linux по этому поводу обсуждалось *1026*, но решения не было.


2018/06/07 ОБНОВЛЕНИЕ 1214

Я связал ответы выше, но, возможно, не был достаточно явным: я посмотрел на locale -a и locale (не перечисляя вывод первого, потому что я установилВСЕ из них в моих попытках ниже):

$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

Чтобыли опробованы, но не работали (и терминал был перезапущен для каждой итерации):

TODO: https://unix.stackexchange.com/questions/294845/bash-warning-setlocale-lc-all-cannot-change-locale-en-us-utf-8

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Вы можете получить список локалей, доступных в Linux, с помощью

locale -a

Используйте один из них.

Вы должны выбрать локаль, соответствующую вашей кодировке, например

initdb -E UTF8 --locale=en_US.utf8

или

initdb -E LATIN9 --locale=et_EE.iso885915

Насколько я знаю, вы можете установить дополнительные локали с помощью

sudo apt-get install language-pack-XX
0 голосов
/ 07 июня 2018

Из этой цепочки :

initdb -D <your_data_location> --no-locale --encoding=UTF8

, где

  --locale=LOCALE       set default locale for new databases
  --no-locale           equivalent to --locale=C

Есть предупреждения (см. Предупреждение ниже), но можно создать базу данных all-utf8используя template0 (см. 21.3. Базы данных шаблонов ).

От клиента (psql):

postgres=# create database test LC_COLLATE "en_US.UTF-8" LC_CTYPE "en_US.UTF-8" template template0;

Или через createdb:

createdb --lc-collate="en_US.UTF-8" --lc-ctype="en_US.UTF-8" --template="template0" test2

Проверка:

$ psql
psql (10.3)
Type "help" for help.

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | C           | C           | 
 template0 | postgres | UTF8     | C           | C           | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | C           | C           | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 test      | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 test2     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

ПРЕДУПРЕЖДЕНИЕ: Вероятно, это неправильное решение, и вышеописанный обходной путь - это просто обходной путь.

Обратите внимание на поля "Collate" и "Ctype" ниже в созданной базе данныхс вышеупомянутым решением, и это может вызвать проблемы, потому что « Результаты сравнения между строками зависят от LC_CTYPE. На практике самый видимый эффект - это порядок сортировки ».( см. Поток DBA StackExchange ).Это также подтверждается в списке рассылки PostgreSQL (см. эту ветку об этой проблеме в производственной базе данных).Вероятно, самый простой способ решить эту проблему - реинициализация / воссоздание базы данных .

postgres=# \l
                             List of databases
   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges   
-----------+----------+----------+---------+-------+-----------------------
 postgres  | postgres | UTF8     | C       | C     | 
 template0 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
 template1 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
(3 rows)
...