Oracle: CharacterSet ändern

Aus Wikibooks
Wechseln zu: Navigation, Suche
Wikibooks buchseite.svg Zurück zu " Datenbank Tuning " | One wikibook.svg Hoch zu " Inhaltsverzeichnis " | Wikibooks buchseite.svg Vor zu " ORACLE Datenbank Administration "


In diesem Kapitel wird beschrieben, wie man den Zeichensatz in einer Datenbank ändern kann. Der Zeichensatz der Datenbank legt fest, mit welcher Codierung die Text-Informationen auf der Festplatte gespeichert werden. Wenn z.B. ein w:ASCII-Zeichensatz mit deutschen Umlauten festgelegt ist, dann können in den Tabellen dieser Datenbank zwar alle deutschen Schiftzeichen gespeichert werden (incl. äöüß), jedoch nicht die Umlaute aller anderen europäischen Länder. Erst recht können keine Schriftzeichen, die nicht auf dem w:lateinischen Alphabet basieren, gespeichert werden. Wenn man für die Datenbank einen w:Unicode-Zeichensatz festlegt, dann können fast alle Schriftzeichen dieser Welt gespeichert werden, allerdings werden für alle seltener vorkommenden Schriftzeichen (also auch den deutschen Umlauten) mehr als ein Byte Speicherplatz verbraucht.

Eine (Rückwärts-) Konvertierung von UTF8 nach WE8MSWIN1252 ist nur mit Verlusten möglich, da WE8MSWIN1252 eine echte Untermenge von UTF8 ist. Beispielsweise sind die griechischen oder kyrillischen Buchstaben in UTF8 vorhanden, aber nicht in WE8MSWIN1252.

Unabhängig vom Zeichensatz der Datenbank ist der Zeichensatz eines Oracle-Clients. Wenn die Zeichensätze sich unterscheiden, dann werden die Daten konvertiert, soweit das möglich ist.

Vor der Umstellung sollte auf jeden Fall ein FullBackup der Datenbank erstellt werden, damit man diesen wieder zurückladen kann, wenn irgend etwas schief geht.

Als sys mit sysdba-Berechtigung via sqlplus an der OracleInstanz anmelden.

sqlplus "sys/password@myDB as sysdba"

CharacterSet der Datenbank überprüfen

select value from nls_database_parameters where parameter='NLS_CHARACTERSET';

bzw. um sämtliche Einstellungen zu sehen

select * from nls_database_parameters;

Die Datenbank anhalten

shutdown immediate;

Die Datenbank einhängen aber noch nicht öffnen

startup mount;

Bei manchen Versionen gab es an dieser Stelle einen Bug, bei dem ein Fehler nach "startup mount;" ausgegeben wurde. Falls dieser noch nicht behoben ist, kann folgender Befehl eventuell helfen "connect / as sysdba".

Session für Operation vorbereiten

alter system enable restricted session;
alter system set job_queue_processes=0;

Datenbank öffnen

alter database open;

CharacterSet ändern

alter database character set UTF8;
ORA-12712: Der neue Zeichensatz muss eine Obermenge des alten Zeichensatzes
sein

hiermit geht es dann

alter database character set internal_use utf8;

Datenbank wieder schließen und herunterfahren

shutdown immediate;

Datenbank wieder normal hochfahren

startup;

Nochmal

select * from nls_database_parameters;

ausführen und die Einstellungen überprüfen.

Getestet auf Oracle 8.1.7.3 unter Windows 2000 Server

Getestet auf Oracle 10.1.0.2.0 unter Linux (erfolgreich)

Getestet auf Oracle 10.2.0.4 unter Windows 2003 Server (erfolgreich, obwohl dies lt. Oracle SQL Reference 10g nicht mehr möglich sein sollte)

Getestet auf Oracle 11.1.0.7 unter AIX5L Server ; erfolgreich.

Getestet auf Oracle 11.2.0.1.0 unter Windows 2008 Enterprise Server ; erfolgreich.

Getestet auf Oracle 11.2.0.1.0 unter Oracle Enterprise Linux 6.4 ; erfolgreich.