Beim Einrichten eines Servers für die Site hatte ich einige Probleme. Insbesondere mit dem Problem der PostgreSQL-Datenbankkodierung. Tatsache ist, dass bei der Installation von PostgreSQL Datenbankvorlagen mit LATIN1-Kodierung erstellt wurden und die Site von Django mit UTF8-Kodierung betrieben wird. Als Ergebnis trat beim Versuch, Daten einzufügen, der folgende Fehler auf:
ERROR: encoding UTF8 does not match locale en_US Detail: The chosen LC_CTYPE setting requires encoding LATIN1.
Nachdem ich nach Informationen gesucht hatte, gelang es mir, mehrere Lösungen zu finden, darunter eine Lösung, mit der Sie eine Datenbankvorlage mit UTF8-Codierung neu erstellen können. Aber lassen Sie uns die Symptome des Problems sorgfältig durchgehen.
Überprüfung der Kodierung
Führen Sie die folgenden Befehle aus, um die auf dem Server und in der Datenbank verwendete Codierung zu überprüfen.
Wir gehen in die Arbeitsweise mit PoctgreSQL:
sudo -u postgres psql
psql ist ein Datenbankdienstprogramm und postgres ist ein PostgreSQL-Superuser.
Und wir führen die folgenden Befehle aus:
postgres=# SHOW SERVER_ENCODING; server_encoding ----------------- LATIN1 (1 row) postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+---------+-------+----------------------- postgres | postgres | LATIN1 | en_US | en_US | template0 | postgres | LATIN1 | en_US | en_US | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | LATIN1 | en_US | en_US | =c/postgres + | | | | | postgres=CTc/postgres (3 rows)
Die Ausgabe zeigt die LATIN1-Codierung für Server und Datenbanken.
Kodierung für Template1 korrigiert
Lassen Sie uns nun die Codierung von template1 korrigieren, die zum Erstellen von Datenbanken verwendet wird.
postgres=# UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1'; postgres=# DROP DATABASE Template1; postgres=# CREATE DATABASE template1 WITH owner=postgres ENCODING = 'UTF-8' lc_collate = 'en_US.utf8' lc_ctype = 'en_US.utf8' template template0; postgres=# UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';
In diesem Fall geben wir zunächst an, dass Vorlage1 keine Vorlage für Datenbanken ist. Wir löschen diese Vorlage. Dann erstellen wir eine neue Vorlage mit UTF8-Kodierung und setzen diese Datenbank als Vorlage für neue Datenbanken. Außerdem werden neue Datenbanken mit UTF8-Kodierung erstellt.
Und schauen wir uns an, in welcher Kodierung die Vorlage template1 ist, der Server selbst wird übrigens immer noch in LATIN1-Kodierung sein
postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | LATIN1 | en_US | en_US | template0 | postgres | LATIN1 | en_US | en_US | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | (3 rows)