Thema Sind Sie Euro-kompatibel? Autor Dr. Gérard Schaller ([email protected]) Art der Information DBA-Tipps (März 2002) Quelle Gesammelte Erfahrungen der Berater der Trivadis AG 1. Übersicht Der Zeichensatz einer Datenbank wird bei der Erstellung der Datenbank festgelegt. Daher ist es von grundlegender Bedeutung, bei der Erstellung der Datenbank den richtigen Zeichensatz auszuwählen. Nachfolgend wird erläutert, wie Sie den richtigen Zeichensatz ermitteln und definieren und wie Sie die Client-Arbeitsplätze an den Euro anpassen. Mithilfe des Oracle Dienstprogramms "csscan" lässt sich feststellen, ob Ihre Datenbank bereits Zeichen enthält, die von deren Zeichensatz nicht unterstützt werden. 2. Auswählen des Zeichensatzes Bei jedem Zeichensatz ermöglicht eine Codetabelle die Zuordnung binärer Werte zu den einzelnen Zeichen. So wird beispielsweise das Eurozeichen € im Zeichensatz WE8ISO8859P15 durch den Wert 164 und im Microsoft Zeichensatz WE8MSWIN1252 durch den Wert 128 repräsentiert. Oracle ermöglicht das Konvertieren von Zeichen eines Zeichensatzes in Zeichen eines neuen Zeichensatzes. In diesem Fall ergibt sich ein übergeordneter Zeichensatz, der mindestens alle Zeichen des Ausgangszeichensatzes umfasst. Werden Zeichen eingegeben, die nicht im Zeichensatz der Datenbank enthalten sind, akzeptiert Oracle diese zwar, ersetzt sie jedoch durch eine interne Codierung, die in keiner der vorhandenen Zeichensatztabellen zu finden ist. Der Zeichensatz US7ASCII enthält keine Codes für Zeichen mit Akzenten. Auch das kürzlich eingeführte Eurozeichen € wird von dem in Westeuropa weit verbreiteten Zeichensatz we8iso8859p1 nicht unterstützt. Der Zeichensatz der Datenbank wird bei der Erstellung der Datenbank definiert. Bei Verwendung des Konfigurationsassistenten der Datenbank haben Sie die Wahl zwischen einer individuellen oder einer vorkonfigurierten Datenbank. Wenn Sie eine individuelle Datenbank auswählen, können Sie den gewünschten Zeichensatz angeben. Bei Verwendung einer vorkonfigurierten Datenbank ermöglicht Oracle das Erstellen einer Datenbank namens "starter database" mithilfe der Dateien auf der CD-ROM. Dies kommt einem Datenbank-Backup gleich. Die vorkonfigurierte Oracle Datenbank verwendet den Zeichensatz US7ASCII. Unter NT liest Oracle den Inhalt der Registry-Variablen NLS_LANG in HKEY_LOCAL_MACHINE \SOFTWARE\ORACLE\ ein. Unter Unix wird die Umgebungsvariable NLS_LANG verwendet. Ist der Registry-Schlüssel oder die Variable NLS_LANG nicht definiert, installiert Oracle die Datenbank mit dem Zeichensatz US7ASCII. Verwenden Sie jedoch einen anderen Wert, wie beispielsweise AMERICAN_AMERICA.WE8ISO8859P15, konvertiert der Assistent den Zeichensatz nach Erstellen der Datenbank automatisch in den Zeichensatz WE8ISO8859P15. Dies können Sie mithilfe des Alert Log nachprüfen: ... Completed: alter database db2 open resetlogs Mon Sep 10 19:53:26 2001 alter database db2 character set WE8ISO8859P15 Mon Sep 10 19:53:27 2001 Thread 1 advanced to log sequence 2 Current log# 2 seq# 2 mem# 0: D:\ORACLE\ORADATA\DB2\REDO02.LOG Thread 1 advanced to log sequence 3 Current log# 3 seq# 3 mem# 0: D:\ORACLE\ORADATA\DB2\REDO01.LOG Thread 1 advanced to log sequence 4 Current log# 1 seq# 4 mem# 0: D:\ORACLE\ORADATA\DB2\REDO03.LOG Thread 1 advanced to log sequence 5 Current log# 2 seq# 5 mem# 0: D:\ORACLE\ORADATA\DB2\REDO02.LOG Mon Sep 10 19:53:41 2001 Completed: alter database db2 character set WE8ISO8859P15 Mon Sep 10 19:53:41 2001 alter database db2 national character set WE8ISO8859P15 Completed: alter database db2 national character set WE8ISO8859P15 Mon Sep 10 19:53:41 2001 alter database rename global_name to "db2" Completed: alter database rename global_name to "db2" Mon Sep 10 19:53:41 2001 Restarting dead background process EMN0 EMN0 started with pid=11 Mon Sep 10 19:53:44 2001 Shutting down instance (normal) ... 3. Welchen Zeichensatz verwenden Sie? Um dies zu ermitteln, geben Sie den folgenden Befehl ein. Dieser Befehl listet die sprachrelevanten Parameter Ihrer Datenbank auf. Hierzu zählen unter anderem die Inhalte der Variablen NLS_CHARACTERSET (für Werte vom Typ Text) und NLS_NCHAR_CHARACTERSET (für die Typen BLOB und CLOB), die bei der Erstellung der Datenbank ausgewählt wurden. SELECT * FROM sys.props$ WHERE name LIKE 'NLS%'; NAME ----------------------NLS_LANGUAGE NLS_TERRITORY NLS_CURRENCY NLS_ISO_CURRENCY NLS_NUMERIC_CHARACTERS NLS_CHARACTERSET NLS_CALENDAR NLS_DATE_FORMAT NLS_DATE_LANGUAGE NLS_SORT NLS_TIME_FORMAT NLS_DUAL_CURRENCY NLS_COMP NLS_NCHAR_CHARACTERSET NLS_RDBMS_VERSION ... VALUE$ -------------------AMERICAN AMERICA $ AMERICA ., WE8ISO8859P15 GREGORIAN DD-MON-RR AMERICAN BINARY HH.MI.SSXFF AM $ BINARY WE8ISO8859P15 8.1.7.0.0 COMMENT$ --------------------Language Territory Local currency ISO currency Numeric characters Character set Calendar system Date format Date language Linguistic definition Time format Dual currency symbol NLS comparison NCHAR Character set RDBMS version for NLS parameters Verwenden Sie den Zeichensatz US7ASCII, müssen Sie sicherstellen, dass Ihre Datenbank keine Zeichen mit einem Code über 128 enthält. Dieser Zeichensatz unterstützt beispielsweise keine Zeichen mit Akzenten. Verwenden Sie den Zeichensatz we8iso8859p1, müssen Sie sicherstellen, dass Ihre Datenbank nicht das Eurozeichen € enthält. Sollten Sie feststellen, dass Sie nicht den richtigen Zeichensatz verwenden, können Sie ab Version 8 den Zeichensatz Ihrer Datenbank mit folgendem Befehl konvertieren: alter database dbname character set WE8ISO8859P15; Hierbei handelt es sich um einen kritischen Vorgang. Lassen Sie diesen Befehl zunächst in einer Testumgebung ausführen, nachdem Sie eine Sicherheitskopie Ihrer Datenbank erstellt haben. Die in der Datenbank enthaltenen Informationen werden weder konvertiert noch geändert. Der neue Zeichensatz ist stets eine übergeordnete Menge des ursprünglichen Zeichensatzes. Sie können selbst jene Daten erneut eingeben, die nicht Bestandteil des ursprünglichen Zeichensatzes sind. Wenn Sie ermitteln möchten, ob die eingegebenen Daten dem neuen Zeichensatz entsprechen, verwenden Sie das in Abschnitt 5 dieses Artikels beschriebene Oracle Dienstprogramm. 4. Konfigurieren der Client-Arbeitsplätze Microsoft Betriebssysteme verwenden eigene Zeichensätze. Für Französisch wird beispielsweise die Microsoft Code Page 1252 verwendet. Hier wird das Eurozeichen unter dem Binärwert 128 abgelegt. Aus diesem Grund muss die Oracle Umgebung unter Windows so konfiguriert werden, dass das Windows Eurozeichen konvertiert und in der Datenbank unter dem Binärwert 164 abgelegt wird. Diese Konvertierung muss beim Eingeben, Ändern oder Lesen von Daten stattfinden. Hierzu muss die Oracle Variable NLS_LANG, die die Verwaltung nationaler Sonderzeichen (für Fehlermeldungen, Zahlenformate, Datumsangaben etc.) ermöglicht, angepasst werden. Unter Windows 2000 befindet sich diese Variable in der Registrierungsdatenbank unter Hkey_Local_Machine/Software/Oracle. Ändern Sie hier den Wert des Schlüssels NLS_LANG in NLS_LANG=FRENCH_FRANCE.WE8MSWIN1252. In diesem Fall verwendet Oracle die "MS Windows Code Page 1252 8-bit West European". Die Variable NLS_LANG kann sich im gleichen Baum auch an anderen Stellen der Registrierungsdatenbank befinden. Enthält die Registrierungsdatenbank zwei Einträge namens ORACLE HOME, muss die Variable NLS_LANG an folgenden Stellen geändert werden: ..\ORACLE_ALL_HOMES\ID0 ..\ORACLE_ALL_HOMES\ID0 ..\ORACLE\HOME0 ..\ORACLE\HOME1 ... Hinweis: Mit dem Dienstprogramm "regfind" aus dem "Technischen Resource-Kit für Windows NT" von Microsoft können alle Schlüssel in der Registrierungsdatenbank automatisch geändert werden. Verwenden Sie hierzu folgenden Befehl: regfind -n "NLS_LANG" regfind -p "HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE" "AMERICAN_AMERICA.WE8ISO8859P15" -r "FRENCH_FRANCE.WE8MSWIN1252" Weicht der Wert der Variable NLS_LANG vom vorgesehenen Wert ab, kann das Eurozeichen dennoch eingegeben und angezeigt werden. Die Konvertierung zwischen Client-Arbeitsplatz und Datenbank ist jedoch fehlerhaft, und das Eurozeichen wird unter einem Binärwert abgelegt, der vom Zeichensatz WE8ISO8859P15 nicht unterstützt wird. In diesem Fall geht das Eurozeichen beim systemübergreifenden Datenaustausch verloren. Mithilfe der Funktion SQL Convert können Sie prüfen, ob Ihre Datenbank und der ClientArbeitsplatz korrekt konfiguriert sind. Der folgende Befehl konvertiert das Eurozeichen mit dem Code 128 aus dem Microsoft Zeichensatz WE8MSWIN1252 in das Eurozeichen mit dem Code 164 des Zeichensatzes WE8ISO8859P15: select dump(convert(chr(128),'','WE8MSWIN1252')) from dual; ---------------Typ=1 Len=1: 164 Basiert die Datenbank beispielsweise auf dem Zeichensatz WE8ISO8859P1, und der Client verwendet den Zeichensatz WE8MSWIN1252, wird der ursprüngliche Wert des Eurozeichens beim erneuten Lesen konvertiert! select dump(convert(convert(chr(128), 'WE8ISO8859P1','WE8MSWIN1252'), 'WE8MSWIN1252','WE8ISO8859P1')) from dual; ---------------Typ=1 Len=1: 191 Anstelle des Werts 128 wird der Wert 191 zurückgegeben, da zur Speicherung im Zeichensatz der Datenbank ein Austauschcode verwendet wurde. Wenn Sie von einem Client-Arbeitsplatz oder mithilfe einer SQL-Abfrage Daten aus der Datenbank abrufen möchten, können Sie die Prozedur PL/SQL verwenden. Diese im Anhang beschriebene Prozedur ermöglicht die Anzeige der grafischen Darstellung des verwendeten Zeichensatzes. 5. Dienstprogramm zum Scannen der Datenbank Ab Version 8.1.7 stellt Oracle ein Werkzeug zum Scannen des Datenbankinhalts zur Verfügung. Mit diesem Werkzeug können Sie feststellen, ob die Datenbank Informationen enthält, die nicht mit dem verwendeten Zeichensatz kompatibel sind. Das Dienstprogramm scannt entweder die gesamte Datenbank, ein Schema oder eine Tabelle: CSSCAN SYSTEM/MANAGER FULL=y TOCHAR=we8iso8859P15 ARRAY=102400 PROCESS=3 Keyword Default Prompt Description ---------- ------- ------ ------------------------------------------------USERID yes username/password FULL N yes scan entire database USER yes user name of the table to scan TABLE yes table name to scan TOCHAR yes new database character set name FROMCHAR current database character set name TONCHAR new NCHAR character set name FROMNCHAR current NCHAR character set name ARRAY PROCESS MAXBLOCKS CAPTURE SUPPRESS FEEDBACK BOUNDARIES LASTRPT LOG PARFILE HELP ---------- 10240 1 yes yes size of array fetch buffer number of scan process split table if larger than MAXBLOCKS N capture convertible data suppress error log by N per table feedback progress every N rows list of column size boundaries for summary report N generate report of the last database scan scan base name of log files parameter file name N show help screen (this screen) ------- ------ ------------------------------------------------- Die Ausgabe enthält die Namen der betroffenen Tabellen sowie die Zeilenkennungen (Rowid) der nicht kompatiblen Daten. Im nachfolgenden Beispiel wurde eine Datenbank mit dem Zeichensatz US7ASCII erstellt. Diese Datenbank enthält im Schema "Scott" eine Tabelle "Test", in die absichtlicht Zeichen mit Akzenten eingegeben wurden. Anschließend wurde mit "csscan" geprüft, ob diese Tabelle die Konvertierung in den Zeichensatz WE8ISO8859P15 unterstützt. Database Scan Individual Exception Report [Database Scan Parameters] Parameter -----------------------------Scan type User name Scan CHAR data? Current database character set New database character set Scan NCHAR data? Array fetch buffer size Number of processes ------------------------------ Value ----------------------------------------------User tables SCOTT YES US7ASCII WE8ISO8859P15 NO 10240 1 ----------------------------------------------- [Application data individual exceptions] User : SCOTT Table : TEST Column: NAME Type : VARCHAR2(10) Number of Exceptions : 1 Max Post Conversion Data Size: 5 ROWID -----------------AAAAxkAADAAAAADAAB ------------------ Exception Type Size Cell Data(first 30 bytes) ------------------ ----- -----------------------------lossy conversion Š‚…”„ ------------------ ----- ------------------------------ 6. Schlussbemerkung Die Einführung des neuen Eurozeichens stellt für die Verwaltung unserer Oracle Datenbanken ein Problem dar. In nicht wenigen Fällen enthalten Datenbanken, die mit dem Zeichensatz US7ASCII erstellt wurden, Zeichen mit Akzenten. Mithilfe des ScanDienstprogramms können die betroffenen Datensätze jedoch ermittelt werden. Doch selbst wenn für die Datenbank der korrekte Zeichensatz verwendet wird – die Konfiguration des Client-Arbeitsplatzes spielt bei der Übergabe der korrekten Informationen an die Datenbank ebenfalls eine wichtige Rolle. Aus diesem Grund ist es nur durch Scannen der Datenbank möglich festzustellen, ob falsch konfigurierte Clients Zeichen übergeben haben, die mit dem Zeichensatz der Datenbank nicht kompatibel sind. Sollten Sie weiterhin Zweifel an der Euro-Kompatibilität Ihrer Systeme haben, wenden Sie sich an Trivadis. ANHANG Prozedur zum Anzeigen der grafischen Darstellung des verwendeten Zeichensatzes: declare i number; j number; k number; begin for i in 2..15 loop for j in 1..16 loop k:=i*16+j; dbms_output.put((to_char(k,'000'))||':'||chr(k)||' if k mod 8 = 0 then dbms_output.put_line(''); end if; end loop; end loop; end; 033:! 041:) 049:1 057:9 065:A 073:I 081:Q 089:Y 097:a 105:i 113:q 121:y 129:¿ 137:¿ 145:¿ 153:¿ 161:¡ 169:© 177:± 185:¹ 193:Á 201:É 034:" 042:* 050:2 058:: 066:B 074:J 082:R 090:Z 098:b 106:j 114:r 122:z 130:¿ 138:¿ 146:¿ 154:¿ 162:¢ 170:ª 178:² 186:º 194: 202:Ê 035:# 043:+ 051:3 059:; 067:C 075:K 083:S 091:[ 099:c 107:k 115:s 123:{ 131:¿ 139:¿ 147:¿ 155:¿ 163:£ 171:« 179:³ 187:» 195:à 203:Ë 036:$ 044:, 052:4 060:< 068:D 076:L 084:T 092:\ 100:d 108:l 116:t 124:| 132:¿ 140:¿ 148:¿ 156:¿ 164:€ 172:¬ 180:¿ 188:Œ 196:Ä 204:Ì 037:% 045:053:5 061:= 069:E 077:M 085:U 093:] 101:e 109:m 117:u 125:} 133:¿ 141:¿ 149:¿ 157:¿ 165:¥ 173: 181:µ 189:œ 197:Å 205:Í 038:& 046:. 054:6 062:> 070:F 078:N 086:V 094:^ 102:f 110:n 118:v 126:~ 134:¿ 142:¿ 150:¿ 158:¿ 166:Š 174:® 182:¶ 190:Ÿ 198:Æ 206:Î 039:' 047:/ 055:7 063:? 071:G 079:O 087:W 095:_ 103:g 111:o 119:w 127: 135:¿ 143:¿ 151:¿ 159:¿ 167:§ 175:¯ 183:· 191:¿ 199:Ç 207:Ï 040:( 048:0 056:8 064:@ 072:H 080:P 088:X 096:` 104:h 112:p 120:x 128:¿ 136:¿ 144:¿ 152:¿ 160: 168:š 176:° 184:¿ 192:À 200:È 208:Ð '); Dr Gérard Schaller, Trivadis AG Trivadis AG Rue de Marterey 5 CH-1005 Lausanne Tel.: +41 21 796 30 10 Fax: +41 21 796 30 11