Ich habe eine Datenbank, die mit dem Standardzeichensatz SQL_ASCII eingerichtet wurde. Ich möchte es auf UNICODE umstellen. Gibt es eine einfache Möglichkeit, das zu tun?
postgresql
unicode
Nick Retallack
quelle
quelle
Antworten:
So ändern Sie die Codierung Ihrer Datenbank:
Stellen Sie sicher, dass die Client-Codierung währenddessen korrekt eingestellt ist.
Quelle: http://archives.postgresql.org/pgsql-novice/2006-03/msg00210.php
quelle
sudo -u postgres pg_dump your_db > /backups/postgresql.sql
...Zunächst einmal ist Daniels Antwort die richtige, sichere Option.
Für den speziellen Fall des Wechsels von SQL_ASCII zu etwas anderem können Sie den pg_database-Katalog betrügen und einfach stupsen, um die Datenbankcodierung neu zuzuweisen. Dies setzt voraus, dass Sie bereits Nicht-ASCII-Zeichen in der erwarteten Codierung gespeichert haben (oder dass Sie einfach keine Nicht-ASCII-Zeichen verwendet haben).
Dann können Sie tun:
update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'thedb'
Dies ändert nichts an der Sortierung der Datenbank, sondern nur daran, wie die codierten Bytes in Zeichen konvertiert werden (daher wird jetzt
length('£123')
4 statt 5 zurückgegeben). Wenn die Datenbank die C-Sortierung verwendet, sollte die Reihenfolge für ASCII-Zeichenfolgen nicht geändert werden. Sie müssen jedoch wahrscheinlich alle Indizes neu erstellen, die Nicht-ASCII-Zeichen enthalten.Vorbehalt Emptor. Durch Dumping und Neuladen können Sie überprüfen, ob der Inhalt Ihrer Datenbank tatsächlich in der von Ihnen erwarteten Codierung vorliegt. Dies ist jedoch nicht der Fall. Und wenn sich herausstellt, dass Sie einige falsch codierte Daten in der Datenbank hatten, wird die Rettung schwierig. Also, wenn Sie können, entleeren und neu initialisieren.
quelle
-bash: syntax error near unexpected token
('`psql
Eingabeaufforderung.Wenn Sie eine Datenbank mit einer bestimmten Codierung sichern und versuchen, sie in einer anderen Datenbank mit einer anderen Codierung wiederherzustellen, kann dies zu einer Beschädigung der Daten führen. Die Datencodierung muss eingestellt werden, bevor Daten in die Datenbank eingefügt werden.
Überprüfen Sie dies : Wenn andere Datenbank zu kopieren, die Codierung und Locale - Einstellungen können nicht von denen der Quelldatenbank geändert werden, denn das ist in korrupten Daten führen könnte.
Und das : Bei einigen Gebietsschema-Kategorien müssen die Werte beim Erstellen der Datenbank festgelegt werden. Sie können unterschiedliche Einstellungen für unterschiedliche Datenbanken verwenden. Sobald eine Datenbank erstellt wurde, können Sie sie für diese Datenbank nicht mehr ändern. LC_COLLATE und LC_CTYPE sind diese Kategorien. Sie wirken sich auf die Sortierreihenfolge der Indizes aus, daher müssen sie festgehalten werden, da sonst die Indizes für Textspalten beschädigt werden. ( Sie können diese Einschränkung jedoch mithilfe von Kollatierungen aufheben , wie in Abschnitt 22.2 erläutert. ) Die Standardwerte für diese Kategorien werden beim Ausführen von initdb festgelegt. Diese Werte werden beim Erstellen neuer Datenbanken verwendet, sofern im Befehl CREATE DATABASE nichts anderes angegeben ist.
Ich würde lieber alles von Anfang an richtig mit einer korrekten lokalen Codierung auf Ihrem Debian-Betriebssystem neu erstellen, wie hier erklärt :
Konfigurieren Sie Ihre lokalen Einstellungen neu:
Wählen Sie Ihr Gebietsschema (wie zum Beispiel für Französisch in der Schweiz: fr_CH.UTF8)
Postgresql deinstallieren und ordnungsgemäß reinigen:
apt-get --purge remove postgresql\* rm -r /etc/postgresql/ rm -r /etc/postgresql-common/ rm -r /var/lib/postgresql/ userdel -r postgres groupdel postgres
Postgresql neu installieren:
aptitude install postgresql-9.1 postgresql-contrib-9.1 postgresql-doc-9.1
Jetzt wird jede neue Datenbank automatisch mit der richtigen Codierung, LC_TYPE (Zeichenklassifizierung) und LC_COLLATE (Zeichenfolgensortierreihenfolge) erstellt.
quelle
Die Antwort von Daniel Kutik ist richtig, aber mit der Umbenennung der Datenbank kann sie noch sicherer sein .
Der wirklich sichere Weg ist also:
Benennen Sie im Notfall einfach die DBs zurück
quelle
# dump into file pg_dump myDB > /tmp/myDB.sql # create an empty db with the right encoding (on older versions the escaped single quotes are needed!) psql -c 'CREATE DATABASE "tempDB" WITH OWNER = "myself" LC_COLLATE = '\''de_DE.utf8'\'' TEMPLATE template0;' # import in the new DB psql -d tempDB -1 -f /tmp/myDB.sql # rename databases psql -c 'ALTER DATABASE "myDB" RENAME TO "myDB_wrong_encoding";' psql -c 'ALTER DATABASE "tempDB" RENAME TO "myDB";' # see the result psql myDB -c "SHOW LC_COLLATE"
quelle