createdb -E UTF8 bringt Fehlermeldung *verzweifel*

Hallo zusammen,

ich versuche gerade auf einem neu hochgezogenen Server ein paar Datenbanken anzulegen, die ich wie bei uns üblich im Encoding UTF8 brauche:
createdb cm_usr -E UTF8
Das hatte bisher auch noch nie Probleme gegeben. Diesmal meckert der Elefant jedoch:

createdb: database creation failed: ERROR:  encoding UTF8 does not match server's locale en_US.ISO-8859-15
DETAIL:  The server's LC_CTYPE setting requires encoding LATIN9.

Das vestehe ich insofern nicht, als der Befehl locale an der Kommandozeile folgendes liefert:

LANG=en_US.utf8
LANGUAGE=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=en_US.utf8

Sollte doch also kein Problem sein?
Ich befinde mich auf einem Ubuntu-7.10-System, Postgres läuft in Version 8.3.
Kann mir jemand irgendetwas dazu sagen? Bin für jeden Hinweis dankbar!

MfG

der Lösungsschmied

Latin9 ist sowieso sehr ungewöhnlich für einen Server in unseren Breiten.

Was passiert, wenn du dir die Locale als ‘postgres’ User anzeigen lässt?

Zum Thema “Locale” habe ich hier noch etwas:

locales on Ubuntu - ads’ corner

Wenn ich mir als postgres-Benutzer mit locale die aktuelle Locale anzeigen lasse, bekomme ich das hier:

LANG=en_US.utf8
LANGUAGE=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=en_US.utf8

Der Befehl locale -a liefert mir folgende verfügbaren Locales:

C
en_US.iso885915
en_US.utf8
POSIX

Also weit und breit nichts, aber auch garnichts von LATIN9 zu sehen! Wie kommt Postgres dann da drauf?

Guten Tag,

ich hatte oder habe dasselbe Problem. Ich bin nun hingegangen und habe alle Datenbanken gelöscht, indem ich das Verzeichnis /usr/local/pgsql/data gelöscht bzw. umbenannt habe. Dann habe ich initdb --locale=de_DE.UTF-8 durchlaufen lassen und damit die Erstkonfiguration neu angelegt. Mit createdb neue_db -E UTF8 konnte ich dieses mal eine Datenbank mit UTF-8 angelegen.

Ist es möglich, dass ALLE Datenbanken mit demselben Zeichensatz angelegt werden müssen? Denn soweit ich das sehe kann ich nun keine Datenbanken mehr in einem anderen Zeichensatz anlegen lassen, sondern immer nur mit UTF-8.

Grüße
Dirk

Hallo Dirk,

meiner Ansicht nach wäre das sehr unflexibel von Postgres, wenn alle DBs das selbe Encoding haben müssten.
Aber der Hinweis von Dir ist trotzdem interessant, ich habe wie von Dir alles gelöscht, neu initialisiert und… leider genau das gleiche.
Aus irgendeinem Grund ist der Server der Ansicht, LATIN9 ist das einzig wahre Encoding :slight_smile:

Aber trotzdem besten Dank!

der Loesungsschmied

Hallo!
Ich hab gerade das selbe Problem allerdings mit ‘latin1’ :slight_smile: .
Meine bisherigen Nachforschungen ergaben, das dieses Problem beim Initialisieren des Datenbereichs über die LC_CTYPE-Einstellung gelöst werden kann. Das hieße, pg_dumpall, neu initiallisieren, dump wiedereinspielen. Interessanterweise tritt dieses Problem hier nur bei einem meiner zwei Server auf. Bei ersten (eingerichtet ohne Kenntnis des Problems :wink: ) tritt es nicht auf, ich kann Datenbanken mit verschiedenen Encodings anlegen, beim anderen tritt es auf, ich kann nur dbs mit UTF-8 anlegen. Wie gesagt soweit die Lösung, die ich bisher gefunden habe. Vielleicht findet sich ja eine Lösung, die mich davor bewahrt, einige GB Geodaten hinundherschubsen zu müssen, deswegen hab ich da noch keine weiteren Infos.

Gruß Uwe

ISO 8859-15 ‘ist’ LATIN9. Scheint so, als ob sich initdb die erste nicht C-Locale greift, die eingetragen ist, wenn man nicht den --locale Parameter benutzt.

Peter

Grundsätzlich wird das Enkodierungsschema verwendet, das beim Initialisieren angegeben wurde (Angelegte Basis: template1). Es ist aber nicht erforderlich, eine neue Initialisierung durchzuführen. Man kann immer das template0 verwenden, um eine neue Datebank im gleichen Cluster mit anderer Enkodierung anzulegen. Um z.B. zu sehen, was an deutschen Kodierungen verfügbar ist:

$ locale -a|egrep -i '^de.+ch’

de_CH
de_CH.iso88591
de_CH.utf8
deutsch

dann z.B.

$ createdb -E iso88591 -T template0 --lc-collate=de_CH --lc-ctype=‘de_CH.iso88591’ dein_db_name