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.

  1. https://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_1004.htm#sthref2671