Postgres столкнулся с: сопоставление ошибок не существует. при попытке изменить сопоставление - PullRequest
2 голосов
/ 05 мая 2020

Я использую docker изображение для postgres

postgres:
    image: postgres:9.6
    ports:
        - '5432:5432'
    container_name: 'postgresql'
    working_dir: /app
    restart: always
    environment:
        POSTGRES_DB: ${POSTGRES_DB}
        POSTGRES_USER: ${POSTGRES_USER}
        POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
        LC_COLLATE: 'sv_SE.UTF-8'
        LC_CTYPE: 'sv_SE.UTF-8'
    volumes:
        - ./data/postgresql:/var/lib/postgresql/data
        - ./postgres/locale.conf:/etc/locale.conf
    networks:
        - php

Я хочу установить swedi sh сопоставление с моим столбцом category_name в category таблице, для этого я просто пытаюсь выполнить этот запрос

ALTER TABLE category ALTER COLUMN category_name SET DATA TYPE character varying(255) COLLATE "sv_SE.UTF-8"

> ERROR:  collation "sv_SE.UTF-8" for encoding "UTF8" does not exist

после этого я выполнил вручную в своем контейнере

root@95494dd4339b:/app# locale-gen sv_SE.utf8 && dpkg-reconfigure locales
Generating locales (this might take a while)...
Generation complete.
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_COLLATE = "sv_SE.UTF-8 UTF-8",
    LC_CTYPE = "sv_SE.UTF-8 UTF-8",
    LANG = "en_US.utf8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)
debconf: falling back to frontend: Readline
Configuring locales
-------------------

Locales are a framework to switch between multiple languages and allow users to
use their language, country, characters, collation order, etc.

Please choose which locales to generate. UTF-8 locales should be chosen by
default, particularly for new installations. Other character sets may be useful
for backwards compatibility with older systems and software.

  1. All locales 

Локали, которые должны быть сгенерированы: 1

и выбор 1 и после загрузки всех локалей, которые я видел

416 sv_SE.UTF-8
Default locale for the system environment: 416

, но после этого все еще сталкивался с той же ошибкой

> ERROR:  collation "sv_SE.UTF-8" for encoding "UTF8" does not exist

при проверке pg_collation Я не нашел свой sv_SE.UTF-8

myuser=# SELECT * FROM pg_collation;
  collname  | collnamespace | collowner | collencoding | collcollate | collctype

------------+---------------+-----------+--------------+-------------+----------
--
 default    |            11 |        10 |           -1 |             | 
 C          |            11 |        10 |           -1 | C           | C
 POSIX      |            11 |        10 |           -1 | POSIX       | POSIX
 C.UTF-8    |            11 |        10 |            6 | C.UTF-8     | C.UTF-8
 en_US      |            11 |        10 |            6 | en_US.utf8  | en_US.utf
8
 en_US.utf8 |            11 |        10 |            6 | en_US.utf8  | en_US.utf
8
 ucs_basic  |            11 |        10 |            6 | C           | C
(7 rows)

myuser=# 

как установить swedi sh сопоставление для моей колонки?

ОБНОВЛЕНИЕ

после ручного выполнения в postgres контейнере locale-gen sv_SE.utf8 && dpkg-reconfigure имеет следующий результат:

root@95494dd4339b:/app# locale -a | grep sv_SE
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
sv_SE
sv_SE.iso88591
sv_SE.iso885915
sv_SE.utf8

Я пытаюсь создать новую базу данных, но столкнулся с той же ошибкой ... что не так ??

myuser=# CREATE DATABASE test WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'sv_SE.UTF-8' LC_CTYPE = 'sv_SE.UTF-8';
ERROR:  invalid locale name: "sv_SE.UTF-8"
myuser=# 
SELECT * FROM category ORDER BY category_name COLLATE "sv_SE";

, но все еще столкнулся с ошибкой > ERROR: collation "sv_SE" for encoding "UTF8" does not exist

может потребоваться перезагрузка службы или что-то в этом роде для применения изменений?

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Если возможно, попробуйте запустить initdb, чтобы PostgreSQL учитывал доступные параметры сортировки (но вам нужно воссоздать базу данных)

или

попробуйте создать сопоставление в существующем экземпляре PostgreSQL с:

 create collation swedish (locale='sv_SE.utf8');
0 голосов
/ 05 мая 2020

Можете ли вы попробовать создать свое собственное docker изображение, подобное этому:

FROM postgres:9.6
RUN localedef -i sv_SE -c -f UTF-8 -A /usr/share/locale/locale.alias sv_SE.UTF-8
ENV LANG sv_SE.utf8

Вы используете том для хранения вашей базы данных вне изображения? Если да, вы можете создать новый образ и запустить его, используя тот же том, что и раньше, и ваши данные должны быть здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...