DOAG Konferenz + Ausstellung 18.11.2014 Nürnberg Character Set & Globalization Martin Hoermann info@ordix.de www.ordix.de
Character Set & Globalization Das Alpha und das Omega, der Erste und der Letzte, der Anfang und das Ende Offenbarung des Johannes (Kap. 22,13) Character Set und Globalization, Martin Hoermann, DOAG 2014 1
Gut zu wissen FAQ: 340512.1 Timestamp Details Infos http://www.interessante.verweise/ zum Nachschlagen Literatur http://www.buch.de Wo ist Larry? Character Set und Globalization, Martin Hoermann, DOAG 2014 2
Character Sets U+2318 place of interest http://www.fileformat.info/ Character Set und Globalization, Martin Hoermann, DOAG 2014 3
Character Set Encoding (ISO/IEC 8859-1) Hermes Baby: http://www.typewriters.ch/images/hermes_baby_jubilee_gr.jpg Character Set und Globalization, Martin Hoermann, DOAG 2014 4
Wichtige Character Sets / Encodings Oracle Pendant ISO 8859-1 WE8ISO8859P1 ISO 8859-15 WE8ISO8859P15 CP 1252 WE8MSWIN1252 CP 850 UTF-8 UTF8 / AL32UTF8 UTF-16 AL16UTF16 Oracle Äquivalent Character Set und Globalization, Martin Hoermann, DOAG 2014 5
Character Set & Oracle Betriebssystem Programme Editoren Fonts NLS_LANG Transfer Character-Set- Datenbank Betriebssystem Programme Editoren NLS_LANG Character Set und Globalization, Martin Hoermann, DOAG 2014 6
NLS_LANG NLS_LANG = GERMAN GERMANY. WE8ISO8859P1 Character Set (Client) Territory (Client + Datenbank) Date format Decimal character and group separator Local currency symbol ISO currency symbol Dual currency symbol First day of the week Credit and debit symbols ISO week flag List separator Language (Client + Datenbank) Language for server messages Language for day and month names and their abbreviations Symbols for equivalents of AM, PM, AD, and BC. Default sorting sequence for character data Writing direction Affirmative and negative response strings (for example, YES and NO) NLS_LANG =.WE8ISO8859P1 Kurzform Character Set und Globalization, Martin Hoermann, DOAG 2014 7
Character Set & Oracle NLS_LANG SELECT sid, serial#, client_charset FROM V$SESSION_CONNECT_INFO; SELECT * FROM V$NLS_PARAMETERS WHERE parameter LIKE '%CHARACTERSET%' ORDER BY parameter; Character Set und Globalization, Martin Hoermann, DOAG 2014 8
Character-Set - Datenbank Changing Or Choosing the Database Character Set ( NLS_CHARACTERSET ) (Doc ID 225912.1) Character Set und Globalization, Martin Hoermann, DOAG 2014 9
Invalid Data ISO-8859-1 ISO-8859-7 Character Set und Globalization, Martin Hoermann, DOAG 2014 10
Invalid Data Pass Through Configuration Encoding: EL8ISO8895P7 NLS_LANG:.WE8ISO8859P1 WE8ISO8895P1 Character Set und Globalization, Martin Hoermann, DOAG 2014 11
Conversion Errors & Replacement Character U+FFFD Unbekannte und ungültige Zeichen im Quell-Character-Set werden zum Replacement Character konvertiert Character Set und Globalization, Martin Hoermann, DOAG 2014 12
Conversion Errors Encoding: EL8ISO8895P7 NLS_LANG:.EL8ISO8859P7 WE8ISO8895P1 Character Set und Globalization, Martin Hoermann, DOAG 2014 13
Konvertierung proben SELECT convert( zeichen, 'WE8ISO8859P1', 'EL8ISO8859P7' ) FROM charset_iso_8859_p1; Character Set und Globalization, Martin Hoermann, DOAG 2014 14
Kodierung eines Character Set U+2A6A5 Drachen, Drachen, Drachen, Drachen Character Set und Globalization, Martin Hoermann, DOAG 2014 15
Character-Set-Kodierung Im Anfang (ἀρχή) war das Wort (λόγος) und das Wort war bei Gott, und das Wort war Gott. Johannesevangelium, Prolog Character Set und Globalization, Martin Hoermann, DOAG 2014 16
Character Set Encoding (ISO/IEC 8859-1) Character Set und Globalization, Martin Hoermann, DOAG 2014 17
Unicode vs. Encoding AL32UTF8 / UTF8 (Unicode) Database Character Set Implications (Doc ID 788156.1) Character Set und Globalization, Martin Hoermann, DOAG 2014 18
UTF-8 nach Unicode SELECT zeichen, dump( zeichen ) FROM WHERE zeichen IN( 'Ä', 'ß' ); T06_8859P1 1: 195 10 132 10 2: 11000011 10000100 3: 00011000100 4: 196 10 = 0xC4 5: U+00C4 Character Set und Globalization, Martin Hoermann, DOAG 2014 19
Übung U+004C U+0061 U+0072 U+0072 U+0079 U+0045 U+006C U+006C U+0069 U+0073 U+006F U+006E Character Set und Globalization, Martin Hoermann, DOAG 2014 20
Wo ist Larry? Lawrence Larry Joseph Ellison Larry = U+004C U+0061 U+0072 U+0072 U+0079 Ellison = U+0045 U+006C U+006C U+0069 U+0073 U+006F U+006E DECLARE -- Konvertierung von ASCII-Zeichen nach Unicode vc VARCHAR2(200) := 'Ellison'; vc_zeichen VARCHAR2(1); vc_out VARCHAR2(1000); BEGIN FOR i IN 1..length( vc ) LOOP vc_zeichen := substr( vc, i, 1 ); vc_out := vc_out ' U+' trim( to_char( ascii( vc_zeichen ), '000X' )); END LOOP; dbms_output.put_line( vc ' = ' vc_out ); END; / Character Set und Globalization, Martin Hoermann, DOAG 2014 21
Dump SELECT zeichen, dump( zeichen, 1016 ) FROM T06_8859P1 WHERE zeichen IN( 'Ä', 'ß' ); Character Set und Globalization, Martin Hoermann, DOAG 2014 22
Wie wird der Character Set bestimmt? U+212E Estimated Symbol Character Set und Globalization, Martin Hoermann, DOAG 2014 23
Betriebssystem Windows: abhängig von Ländereinstellungen (z.b. CP1252) DOS: bestimmt durch chcp (z.b. Code Page 850) Unix/Linux: durch LANG Character Set und Globalization, Martin Hoermann, DOAG 2014 24
SQL*Developer Character Set und Globalization, Martin Hoermann, DOAG 2014 25
TOAD Character Set und Globalization, Martin Hoermann, DOAG 2014 26
Ultra Compare Ultra Compare bestimmt die Kodiderung einer Datei automatisch, wird beispielsweise das Rote Zeichen im Screenshot gefunden, so nimmt das Tool eine bestimmte Kodierung an (hier MAC-UTF-8). Die Kodierung lässt sich einstellen. Character Set und Globalization, Martin Hoermann, DOAG 2014 27
Unicode in der Datenbank Character Set und Globalization, Martin Hoermann, DOAG 2014 28
Unicode Character Sets Character Set Name RDBMS Version Unicode Version AL24UTFFSS 7.2-8.1 1.1 UTF8 8.0-12c 2.1 (8.0-8.1.6) 3.0 (8.1.7-12.1) UTFE AL32UTF8 AL16UTF16 8.0-12c 9.0-12c 2.1 (8.0-8.1.6) 3.0 (8.1.7-12.1) 3.0 (9.0) 3.1 (9.2) 3.2 (10.1) 4.01 (10.2) 5.0 (11.1 and 11.2) 6.1 (12.1). Unicode Character Sets In The Oracle Database (Doc ID 260893.1) Character Set und Globalization, Martin Hoermann, DOAG 2014 29
Character-Set-Einstellungen V$NLS_PROPERTIES NLS_CHARACTERSET CHAR VARCHAR2 LONG CLOB (in Multibyte-Zeichensätzen immer AL16UTF16 Big Endian) Objektnamen und PL/SQL Code NLS_NCHAR_CHARACTERSET NCHAR NVARCHAR2 NCLOB Character Set und Globalization, Martin Hoermann, DOAG 2014 30
NLS_LENGTH_SEMANTIC Maximal 1.500 Zeichen Maximal 4.000 Bytes Maximal 32.767 Bytes (12c) MAX_STRING_SIZE = EXTENDED VARCHAR2, NVARCHAR2, RAW VARCHAR2( 1500 CHAR ) NLS_LENGTH_SEMANTICS The National Character Set ( NLS_NCHAR_CHARACTERSET ) in Oracle 9i, 10g, 11g and 12c (Doc ID 276914.1) Character Set und Globalization, Martin Hoermann, DOAG 2014 31
UTF8 in SQL*Plus Character Set und Globalization, Martin Hoermann, DOAG 2014 32
Character Set ändern U+1F4BE Character Set und Globalization, Martin Hoermann, DOAG 2014 33
Update Character Set There are still "dba's" out there who try to change the NLS_CHARACTERSET or NLS_NCHAR_CHARACTERSET by updating props$. This is NOT supported and WILL corrupt your database. This is one of the best way's to destroy a complete dataset. Oracle Support will TRY to help you out of this but Oracle will NOT warrant that the data can be recovered or recovered data is correct. You WILL be asked to do a FULL export and a complete rebuild of the database. Please, do NOT update props$. Changing Or Choosing the Database Character Set ( NLS_CHARACTERSET ) (Doc ID 225912.1) Character Set und Globalization, Martin Hoermann, DOAG 2014 34
Character Set ändern Export / Import CSSCAN / CSALTER Database Migration Assistant for Unicode (DMU) Character Set und Globalization, Martin Hoermann, DOAG 2014 35
DMU Startseite Character Set und Globalization, Martin Hoermann, DOAG 2014 36
DMU Features GUI-geführte Migration Vorteile: In Place Data Validation / Cleansing Editor Behebung von Pass-Through-Konfigurationen (je Spalte) Ausschluss der Migration (je Spalte) Zu beachten: manuelle Tätigkeiten bzgl. Data Dictionary nur Unicode als Ziel Character Set und Globalization, Martin Hoermann, DOAG 2014 37
DMU Pass-Through-Konfiguration Character Set und Globalization, Martin Hoermann, DOAG 2014 38
DMU Fehler im Data Dictionary SELECT table_name, convert( table_name, 'AL32UTF8' ) konvertiert FROM user_tables WHERE convert( table_name, 'AL32UTF8' ) <> table_name; Character Set und Globalization, Martin Hoermann, DOAG 2014 39
DMU Migration Ausnahmen Character Set und Globalization, Martin Hoermann, DOAG 2014 40
DMU Finish http://blogs.loopback.org/wp-content/uploads/2013/11/doag_2013_unicode_v_1.0.pdf Character Set und Globalization, Martin Hoermann, DOAG 2014 41
Unicode (U+FDFA) U+FDFA SALLALLAHOU ALAYHE WASALLAM Mögen Allahs Segen und Frieden auf ihm sein Character Set und Globalization, Martin Hoermann, DOAG 2014 42
Unicode Themenauswahl Glyphen vs. Zeichen Diakritische Zeichen Ligaturen & Digraphen Carriage Return vs. Line Feed Komposition Schreibrichtung BOM Character Set und Globalization, Martin Hoermann, DOAG 2014 43
Glyphen vs. Zeichen Character Set und Globalization, Martin Hoermann, DOAG 2014 44
Zeichen U+0041 Latin A U+FF21Halfwidth Latin A U+0391 GREEK CAPITAL LETTER ALPHA U+0410 Cyrillic Capital Letter A Character Set und Globalization, Martin Hoermann, DOAG 2014 45
Diakritische Zeichen www.wikipedia.de Character Set und Globalization, Martin Hoermann, DOAG 2014 46
Komposition unistr( '\00C4' ) unistr( '\0041\0308' ) = Ä (static precomposed) = Ä (dynamic composed) Character Set und Globalization, Martin Hoermann, DOAG 2014 47
Komposition SELECT zeichen FROM composition ORDER BY zeichen; CANONICAL_EQUIVALENCE = TRUE Character Set und Globalization, Martin Hoermann, DOAG 2014 48
Komposition SELECT zeichen FROM composition ORDER BY zeichen; Character Set und Globalization, Martin Hoermann, DOAG 2014 49
Ligaturen & Digraphen Ligatur: Verbindung von zwei oder mehr Buchstaben zu einer Glyphe ß w nls_upper( 'ß', 'NLS_SORT=''GERMAN''' ) nls_upper( 'ß', 'NLS_SORT=''XGERMAN''' ) nls_upper( 'ß', 'NLS_SORT=''GERMAN_DIN''' ) nls_upper( 'ß', 'NLS_SORT=''XGERMAN_DIN''' ) Character Set und Globalization, Martin Hoermann, DOAG 2014 50
Ligaturen & Digraphen Digraph: Kombination von zwei oder mehr Buchstaben für ein Phonem sch ae für ä Ch im Spanischen (NLS_SORT=SPANISH_M) Character Set und Globalization, Martin Hoermann, DOAG 2014 51
Ligaturen & Digraphen Mögen Allahs Segen und Frieden auf ihm sein. Wird immer nach dem Nennen des Namens von Mohammed aus Respekt gesagt/geschrieben. Character Set und Globalization, Martin Hoermann, DOAG 2014 52
Carriage Return vs. Line Feed Carriage Return = U+0013 Windows = CR/LF Unix = LF Mac = CR Line Feed = U+0010 Character Set und Globalization, Martin Hoermann, DOAG 2014 53
Writing Directions Character Set und Globalization, Martin Hoermann, DOAG 2014 54
Writing Directions to_char( sysdate, 'Day', 'NLS_DATE_LANGUAGE=''ARABIC''' ) Character Set und Globalization, Martin Hoermann, DOAG 2014 55
Byte Order Mark (BOM) Dient zur Markierung von UTF16-Kodierungen Dient zur Unterscheidung von Big- und Little Endian U+FEFF: Zero Width No-Break Space U+FFFE: ungültiges Zeichen (bei Big- und Little-Endian Vertauschung) Character Set und Globalization, Martin Hoermann, DOAG 2014 56
Byte Order Mark (BOM) In UTF8 ergibt sich daraus die Bytefolge 0xEFBBBF In Windows CP 1252 interpretiert wird es dann 0xEF = Lateinischer Kleinbuchstabe i mit Trema 0xBB = Nach rechts zeigendes doppeltes spitzes Anführungszeichen 0xBF = Umgekehrtes Fragezeichen Character Set und Globalization, Martin Hoermann, DOAG 2014 57
Byte Order Mark (BOM) Wird U+FEFF aus UTF16 in CP 1252 interpretiert Dann ist die Bytefolge 0xFEFF in CP1252 wie folgt 0xFE = Latin small letter thorn 0xFF = Latin small letter y with diaeresis Character Set und Globalization, Martin Hoermann, DOAG 2014 58
BOM-Byte in SQL*Plus 0xEFBBBF in CP850 Character Set und Globalization, Martin Hoermann, DOAG 2014 59
Literatur Character Set und Globalization, Martin Hoermann, DOAG 2014 60
Collation & Sorting U+4DC0 Hexagram for the creative heaven Hexagramme: http://www.unicode.org/charts/pdf/u4dc0.pdf Character Set und Globalization, Martin Hoermann, DOAG 2014 61
Collation: Sortierung vs. Vergleich ALTER SESSION SET NLS_COMP=LINGUISTIC; ALTER SESSION SET NLS_SORT=BINARY_CI; http://docs.oracle.com/database/121/nlspg/ch5lingsort.htm#nlspg976 Character Set und Globalization, Martin Hoermann, DOAG 2014 62
Sortierverfahren Binary Monolingual Multilingual Unicode Collation Algorithm Character Set und Globalization, Martin Hoermann, DOAG 2014 63
Monolingual NLS_SORT=SPANISH_M Character Set und Globalization, Martin Hoermann, DOAG 2014 64
Multilingual Oracle Globalization multilingual collation can sort data in more than one language in one sort Ja, aber hier geht es um die Sortierung von Alphabeten (Latein, Griechisch ) Unicode Collation Algorithm Collation varies according to language and culture Character Set und Globalization, Martin Hoermann, DOAG 2014 65
Deutsche Sortierungen GERMAN XGERMAN GERMAN_DIN Deutsche Telefonbuch Norm XGERMAN_DIN _CI _AI case-insensitive z.b. XGERMAN_CI accent-insensitive and case-insensitive z.b. XGERMAN_AI http://www.pipperr.de/dokuwiki/doku.php?id=prog:sql_nls_comp_nls_sort_inguistic_search_sorting Character Set und Globalization, Martin Hoermann, DOAG 2014 66
Unicode Collation Algorithm NLS_SORT=UCA0610_SPANISH_S4_VS_BY_EN_FN_HN_DN_MN Version Character Set und Globalization, Martin Hoermann, DOAG 2014 67
Unicode Collation Algorithm NLS_SORT=UCA0610_SPANISH_S4_VS_BY_EN_FN_HN_DN_MN Sprache Character Set und Globalization, Martin Hoermann, DOAG 2014 68
Unicode Collation Algorithm NLS_SORT=UCA0610_SPANISH_S4_VS_BY_EN_FN_HN_DN_MN Unicode Comparison Level _S1 / _AI = Zeichen _S2 / _CI = Unterscheidung diakritische Zeichen bei gleichen Buchstaben _S3 = Klein- / Großschreibung und weitere Besonderheiten _S4 = z.b. Unterscheidung von Hiragana und Katakana Character Set und Globalization, Martin Hoermann, DOAG 2014 69
Unicode Collation Algorithm NLS_SORT=UCA0610_SPANISH_S4_VS_BY_EN_FN_HN_DN_MN Variable Characters (Blank, Dash ) & Weighting _VB = blanked: Variable Zeichen (z.b. Blank) werden ignoriert _VN = Non-ignorable: Variable Zeichen werden gewichtet und verglichen _VS = Shifted: Variable Zeichen werden auf den Level 1-3 ignoriert und dann gewichtet Character Set und Globalization, Martin Hoermann, DOAG 2014 70
Unicode Collation Algorithm NLS_SORT=UCA0610_SPANISH_S4_VS_BY_EN_FN_HN_DN_MN Backwards _BY = on diakritische Zeichen werden nach Richtung sortiert _BN = off Character Set und Globalization, Martin Hoermann, DOAG 2014 71
Unicode Collation Algorithm NLS_SORT=UCA0610_SPANISH_S4_VS_BY_EN_FN_HN_DN_MN Normalization Case First hiraganaquaternary numeric match style Character Set und Globalization, Martin Hoermann, DOAG 2014 72
Weiterführende Themen Character Set und Globalization, Martin Hoermann, DOAG 2014 73
TO_CHAR Format Maske D = Tag der Woche (1-7) abhängig von NLS_TERRITORY z.b. Sonntag AMERICA = 1 GERMANY = 7 NLS_TERRITORY kann nicht im to_char definiert werden ALTER SESSION SET NLS_TERRITORY='AMERICA'; SELECT to_char( to_date ( '09.11.2014', 'DD.MM.YYYY' ), 'D', 'NLS_DATE_LANGUAGE=''GERMAN''' ) FROM dual; Character Set und Globalization, Martin Hoermann, DOAG 2014 74
Oracle Locale Builder Character Set und Globalization, Martin Hoermann, DOAG 2014 75
U+17DA U+17DA: KHMER SIGN KOOMUUT Das Khmer-Zeichen Koomuut wird traditionell als Schmuckelement verwendet, welches das Ende eines Buches oder eine Abhandlung kennzeichnet. Character Set und Globalization, Martin Hoermann, DOAG 2014 76
Zentrale Paderborn Westernmauer 12-16 33098 Paderborn Tel.: 05251 1063-0 Seminarzentrum Wiesbaden Kreuzberger Ring 13 65205 Wiesbaden Tel.: 0611 77840-00 Zentrales Fax: 0180 1 67349 0 0180 1 ORDIX 0 Weitere Geschäftsstellen in Köln, Münster und Neu-Ulm E-Mail: info@ordix.de Internet: http://www.ordix.de Vielen Dank für Ihre Aufmerksamkeit!