1. Übersicht 2. Auswählen des Zeichensatzes

Werbung
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
Herunterladen