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 Schriftzeichen gespeichert werden (inkl. ä, ö, ü und ß), jedoch nicht die Umlaute aller anderen europäischen Länder. Erst recht können keine Schriftzeichen gespeichert werden, die nicht auf dem w:lateinischen Alphabet basieren. Wenn man für die Datenbank einen w:Unicode-Zeichensatz festlegt, dann können fast alle Schriftzeichen dieser Welt gespeichert werden, allerdings wird für alle seltener vorkommenden Schriftzeichen (also auch für die deutschen Umlaute) jeweils 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. Außerdem sei erwähnt, dass "alter database character set ..." seit Oracle 10gR1 nicht mehr unterstützt wird[1]. Nachfolgende Anleitung ist deshalb nur mit größter Vorsicht zu verwenden, laut Oracle Dokumenation können die Daten in CLOB Spalten korrupt werden. Wenn man sicher gehen will, sollte man sich besser an die entsprechende Dokumentation von Oracle halten: Character Set Migration
Als sys mit sysdba-Berechtigung via sqlplus an der Oracle Instanz 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.