Puncte:1

Docker PostgreSQL modifică codificarea bazei de date în UTF-8

drapel in

Vreau să rulez prin docker-compose un container postgres care are COLLATE și CTYPE „C” și codificarea bazei de date „UTF-8”. Dar acest lucru pare a fi imposibil.

Aceasta este partea din docker-compose.yml:

Bază de date:
    imagine: postgres:latest
    volume:
        - db:/var/lib/postgresql/data
    mediu inconjurator:
        POSTGRES_PASSWORD: test
        LC_COLLATE: C
        LC_CTYPE: C
        LANG: C.UTF-8

Și aceasta este rezultatul jurnalului:

Clusterul bazei de date va fi inițializat cu locale.
Configurația implicită de căutare a textului va fi setată la „engleză”.
  COLAȚIONARE: C
  TIP: C
  MESAJE: C.UTF-8
  MONETAR: C.UTF-8
  NUMERICE: C.UTF-8
  TIMP: C.UTF-8
Codarea implicită a bazei de date a fost setată în consecință la „SQL_ASCII”.

Trebuie să am codificarea bazei de date în UTF-8 și COLLATE și CTYPE în „C” și nu „C.UTF-8”, altfel o aplicație dependentă nu se poate conecta.

Nu am găsit nimic în nicio documentație sau altundeva.

Puncte:2
drapel cn

Trebuie să uniți două piese ale puzzle-ului aici:

https://www.postgresql.org/docs/9.5/app-initdb.html

initdb, vă învață cum să transmiteți informații de codificare la funcția de creare a bazei de date.

Imaginea oficială Postgres Docker, afirmă că puteți trece opțiuni, la initdb:

https://hub.docker.com/_/postgres

Ergo, răspunsul ar fi ceva de genul:

Bază de date:
    imagine: postgres:latest
    volume:
        - db:/var/lib/postgresql/data
    mediu inconjurator:
        POSTGRES_PASSWORD: test
        POSTGRES_INITDB_ARGS: '--encoding=UTF-8 --lc-colate=C --lc-ctype=C'

Sau argumente similare. Am ignorat opțiunea lang, deoarece aceasta nu este o opțiune oficială „transmite acest steag la postgres” pe pagina de manual (primul link pe care l-am inclus).

Testele mele nu au rulat acest lucru folosind docker compose, ci a fost pe linia de comandă folosind opțiunea -e. Acesta este însă exact același concept; „mediu” în docker compose este -e pe linia de comandă. Adica:

https://docs.docker.com/engine/reference/commandline/run/

--env , -e Setează variabilele de mediu

Testul #1 cu doar parola env setată:

docker run -e POSTGRES_PASSWORD=test postgres:latest

Iată rezultatul rulării implicite:

postgres@cbf23636dabc:~$ psql
psql (13.4 (Debian 13.4-1.pgdg100+1))
Tastați „ajutor” pentru ajutor.

postgres=# \l
                                 Lista bazelor de date
   Nume | Proprietar | Codificare | Colate | Ctype | Privilegii de acces   
-----------+----------+----------+------------+--- ---------+------------------------
 postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | 
 template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
           | | | | | postgres=CTc/postgres
 template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
           | | | | | postgres=CTc/postgres

Testul #2, cu variabilele de mediu setate ca mai sus în dockerul sugerat compus numai pe CLI:

rulare docker -e POSTGRES_PASSWORD=test -e POSTGRES_INITDB_ARGS='--encoding=UTF-8 --lc-collate=C --lc-ctype=C' postgres:latest

Și apoi rezultatul:

postgres@b6b80c876f3e:~$ psql 
psql (13.4 (Debian 13.4-1.pgdg100+1))
Tastați „ajutor” pentru ajutor.

postgres=# \l
                             Lista bazelor de date
   Nume | Proprietar | Codificare | Colate | Ctype | Privilegii de acces   
-----------+----------+----------+---------+------ -+-----------------------
 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

Rețineți, de asemenea, secțiunea de pe pagina oficială a imaginii Postgresql Docker, unde descrie scripturile de inițializare. Acesta este ceva la care te poți uita și tu.

Philipp avatar
drapel in
Mulțumesc. Este prima dată când lucrez cu PostgreSQL. Nu știam cum funcționează în detaliu crearea bazei de date.
drapel cn
Nici o problema! Postgres este un pic un urs, dar cu siguranță aș sugera să găsești o interfață grafică pentru a lucra cu el, dacă poți. Există mai multe opțiuni, deși preferatul meu personal este pgAdmin. Sursa deschisa.
Puncte:0
drapel cn
xji

Am încercat abordarea de mai sus și o altă problemă pe care am întâlnit-o a fost că baza implicită Debian care vine cu imaginea oficială Postgres Docker nu are alte limbi instalate.

# locale -a
C
C.UTF-8
en_US.utf8
POSIX

Pentru a seta o altă limbă, de ex. Chineză, a fost necesar să ruleze de ex. localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8.

Apoi setarea variabilelor de mediu a funcționat.

Din cauza acestei necesități, se pare că imaginea implicită Postgres nu satisface toate nevoile și ar fi mai bine să construiți o imagine personalizată, așa cum este documentat. în această postare.

DIN postgres
RUN localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8
ENV LANG zh_CN.utf8

Atunci docker build -t numele-imagine-personalizată .

Apoi puteți utiliza imaginea personalizată în dvs docker-compose.yml în loc de imaginea oficială postgres, fără a fi nevoie să setați în plus nicio variabilă de mediu.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.