Oracle: CharacterSet ändern
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.