it-swarm.com.de

Wie ändere ich die standardmäßige client_encoding in Postgres?

Ich versuche, den Standardwert für die Konfigurationsvariable client_encoding für eine von mir ausgeführte PostgreSQL-Datenbank zu ändern. Ich möchte, dass es UTF8 ist, aber momentan wird es auf LATIN1 gesetzt.

Die Datenbank ist bereits auf die Verwendung der UTF8-Codierung eingestellt:

application_database=# \l
                                                 List of databases
           Name       |  Owner   | Encoding |   Collate   |    Ctype    |          Access privileges
----------------------+----------+----------+-------------+-------------+--------------------------------------
 postgres             | postgres | LATIN1   | en_US       | en_US       |
 application_database | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | postgres=CTc/postgres           +
                      |          |          |             |             | application_database=Tc/postgres
 template0            | postgres | LATIN1   | en_US       | en_US       | =c/postgres                     +
                      |          |          |             |             | postgres=CTc/postgres
 template1            | postgres | LATIN1   | en_US       | en_US       | =c/postgres                     +
                      |          |          |             |             | postgres=CTc/postgres
(4 rows)

Welche laut der Dokumentationbereits sollte dazu führen, dass der Client UTF8 als Standard-client_encoding verwendet (Hervorhebung meiner):

client_encoding (string)

Legt die clientseitige Codierung (Zeichensatz) fest. Standardmäßig wird die Datenbankcodierung verwendet.

Aber das tut es nicht:

$ Sudo psql --dbname=application_database
psql (9.1.19)
Type "help" for help.

application_database=# SHOW client_encoding;
 client_encoding
-----------------
 LATIN1
(1 row)

Ich habe sogar versucht, mit ALTER USER <user> SET ... die Standardkonfiguration für den Benutzer zu ändern, unter dem ich mich anmelde:

application_database=# ALTER USER root SET client_encoding='UTF8';
ALTER ROLE
application_database=# SELECT usename, useconfig FROM pg_shadow;
         usename      |       useconfig
----------------------+------------------------
 postgres             |
 root                 | {client_encoding=UTF8}
 application_database |
(3 rows)

Das hatte aber auch keinen Effekt:

$ Sudo psql --dbname=application_database
psql (9.1.19)
Type "help" for help.

application_database=# SELECT current_user;
 current_user
--------------
 root
(1 row)

application_database=# SHOW client_encoding;
 client_encoding
-----------------
 LATIN1
(1 row)

In den PSQL-Dateien auf meinem System ist nichts enthalten:

[email protected]:~$ cat ~/.psqlrc
cat: /home/vagrant/.psqlrc: No such file or directory
[email protected]:~$ cat /etc/psqlrc
cat: /etc/psqlrc: No such file or directory
[email protected]:~$ Sudo su
[email protected]:/home/vagrant# cat ~/.psqlrc
cat: /root/.psqlrc: No such file or directory

Ich verwende PosgreSQL 9.1:

application_database=# SELECT version();
                                                   version
-------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.1.19 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
(1 row)
5
Ajedi32

Okay, also zu allererst: Warum hat das Setzen der Benutzer- oder Datenbankkodierung keine Wirkung?

Es stellte sich heraus, dass es wegen dieser Zeile aus der psql-Dokumentation liegt:

Wenn mindestens eine der Standardeingaben und/oder Standardausgaben ein Terminal ist, setzt psql die Clientcodierung auf "auto", wodurch die entsprechende Clientcodierung anhand der Ländereinstellungen (Umgebungsvariable LC_CTYPE auf Unix-Systemen) erkannt wird. Wenn dies nicht wie erwartet funktioniert, kann die Clientcodierung mit der Umgebungsvariablen PGCLIENTENCODING überschrieben werden.

In der Tat haben Ihre vorherigen Konfigurationsänderungen tatsächlich funktioniert, nur nicht in der interaktiven psql-Konsole. Versuchen Sie den folgenden Befehl:

Sudo psql --dbname=application_database -c "SHOW client_encoding;" | cat

Sie sollten sehen, dass die Client-Kodierung tatsächlich UTF8 ist:

 client_encoding
-----------------
 UTF8
(1 row)

Führen Sie den Befehl jetzt erneut aus, ohne ihn jedoch an cat weiterzuleiten:

Sudo psql --dbname=application_database -c "SHOW client_encoding;"

Sie sollten das Ergebnis erhalten:

 client_encoding
-----------------
 LATIN1
(1 row)

Im Grunde verwendet psql nur LATIN1-Kodierung für Befehle, die das Terminal betreffen.

Wie können Sie das beheben? Nun, es gibt einige Möglichkeiten.

Sie können dies tun, wie die Dokumente vorschlagen, und die Umgebungsvariable PGCLIENTENCODING auf UTF8 setzen, z. B. ~/.profile oder ~/.bashrc, um nur Ihren Benutzer zu beeinflussen, oder /etc/environment, um das gesamte System zu beeinflussen (siehe Festlegen von Umgebungsvariablen ).

Eine andere Option wäre, die Systemeinstellungen für das System so zu konfigurieren, dass en_US.utf8 anstelle von en_US (oder gleichwertig) verwendet wird. Die Methode hierfür kann abhängig von Ihrem System variieren. Normalerweise können Sie dies tun, indem Sie ~/.config/locale.conf (nur Ihr Benutzer) oder /etc/default/locale oder /etc/locale.conf (systemweit) ändern. Dies wird sich nicht nur auf Postgres auswirken, und ich glaube, die Wurzel des Problems wird genauer angesprochen. Sie können Ihre aktuellen Ländereinstellungen überprüfen, indem Sie locale ausführen.

Eine andere Lösung wäre, Ihre psqlrc-Datei mit SET client_encoding=UTF8; zu aktualisieren. Diese Datei befindet sich unter ~/.psqlrc (nur Ihr Benutzer) oder /etc/psqlrc (systemweit). Beachten Sie, dass diese Methode das Ergebnis des Befehls, den wir zuvor für die Clientcodierung verwendet haben, nicht beeinflusst, da the docs state (Hervorhebung meines):

--command=command

Gibt an, dass psql eine Befehlszeichenfolge, einen Befehl und dann einen Befehl ausführt. Dies ist nützlich in Shell-Skripten. Startdateien (psqlrc und ~/.psqlrc) werden mit dieser Option ignoriert.

9
Ajedi32

Haben Sie client_encoding in postgresql.conf eingestellt (und die Konfiguration neu geladen oder neu gestartet)? Stellen Sie sicher, dass es UTF8 und nicht Utf8 ist

Was ist das Ergebnis von cat ~/.psqlrc und cat /etc/psqlrc?

Ich weiß, dass Sie nach serverseitigen Standardwerten suchen, aber auf dem Client können Sie eine Betriebssystemumgebung festlegen:

export PGCLIENTENCODING=UTF8

um dies für alle Benutzer (auf diesem Computer) zu tun, geben Sie dies in /etc/profile ein.

1
Neil McGuigan