Oracle-Zeichensatzkonvertierung (9): 6. So konvertieren Sie vom Benutzer implementierte Zeichensätze (2)
Vorherigen Post (Oracle-Zeichensatzkonvertierung(8): 6. So konvertieren Sie einen vom Benutzer implementierten Zeichensatz (1)) wird die vom Benutzer implementierte Zeichensatzkonvertierungsmethode untersucht. Sie können überprüfen, wie Sie mithilfe von DB Link-, CTAS- und UTL_RAW-Paketen von KO16MSWIN949, US7ASCII in AL32UTF8 konvertieren.
6.2.3. Methode 3) DB Link & CTAS & UTL_RAW
Dies ist eine Methode zum Konvertieren von Zeichensätzen beim Importieren von Daten über DB Link.
Konfigurieren Sie drei DB-Instances auf einem Server und führen Sie drei Tests durch.
- Holen Sie sich ORAUS7-Daten von ORAMSWIN949
- Holen Sie sich ORAMSWIN949-Daten von ORAUTF
- Holen Sie sich ORAUS7-Daten von ORAUTF
In ORAUS7 gespeicherte Hangul-Daten können wie folgt überprüft werden.
C:\Users\ymlee>SET NLS_LANG=AMERICAN_AMERICA.US7ASCII C:\Users\ymlee>sqlplus leg/leg@oraus7 SQL*Plus: Release 11.2.0.1.0 Production on Sun Jul 17 22:34:26 2022 Copyright (c) 1982, 2010, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> set pagesize 100 SQL> set linesize 200 SQL> select use_mon, line_num, sub_sta_id, sub_sta_nm, ride_pasgr_num, alight_pasgr_num, work_dt 2 from sub_mon_stat 3 where rownum <= 10 4 ; USE_MON LINE_NUM SUB_ SUB_STA_NM RIDE_PASGR_NUM ALIGHT_PASGR_NUM WORK_DT -------- -------------- ---- -------------------- -------------- ---------------- -------- 201301 2호선 0214 강변 1565310 1549316 20130723 201301 2호선 0215 잠실나루 536413 505376 20130723 201301 2호선 0216 잠실 2323516 2106978 20130723 201301 2호선 0217 신천 814104 786397 20130723 201301 2호선 0218 종합운동장 374633 389860 20130723 201301 2호선 0219 삼성 2015421 2050988 20130723 201301 2호선 0220 선릉 1773445 1572999 20130723 201301 2호선 0221 역삼 1496812 1644097 20130723 201301 2호선 0222 강남 3453154 3558986 20130723 201301 2호선 0223 교대 1195621 1323778 20130723 10 rows selected. SQL>
Die folgenden Tests verwenden Oracle SQL Developer.
SQL Developer ist ein von Oracle bereitgestelltes und kostenloses Tool. Sie können es von der unten stehenden URL herunterladen.
Downloads für Oracle SQL-Entwickler
Test #1) Holen Sie sich ORAUS7-Daten von ORAMSWIN949
Sie können Daten importieren, indem Sie einen DL_US7-DB-Link erstellen und den DB-Link „dl_us7“ angeben. Das Skript ist wie folgt.
CREATE DATABASE LINK DL_US7 CONNECT TO leg IDENTIFIED BY leg USING '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORAUS7) ) )' ; select use_mon, line_num, sub_sta_id, sub_sta_nm, ride_pasgr_num, alight_pasgr_num, work_dt, commt from sub_mon_stat@dl_us7 ;
Koreanische Zeichen im Ausführungsergebnis werden nicht normal angezeigt, sondern erscheinen als ?-Zeichen (Fragezeichen).
Beim Datenimport über DB Link wird der Zeichensatz des Servers (hier ORAUS7) in den Zeichensatz des Clients (hier ORAMSWIN949) konvertiert.
Das in US7ASCII gespeicherte Hangul wird falsch gespeichert, sodass es nicht in MSWIN949 konvertiert werden kann, sodass es als Fragezeichen angezeigt wird.
Um in dieser Situation die koreanischen ORAUS7-Daten normal anzuzeigen, wenden Sie die folgende Methode an.
- Erstellen Sie eine Ansicht in ORAUS7 mit der Funktion UTL_RAW.CAST_TO_RAW, um zu verhindern, dass Spalten des Datentyps VARCHAR2, die koreanische Zeichen enthalten, in Zeichensätze konvertiert werden.
- Wenden Sie die Funktion UTL_RAW.CAST_TO_RAW auf Spalten an, die koreanische Zeichen enthalten.
- Der RAW-Datentyp konvertiert den Zeichensatz nicht.
- ORAMSWIN949 fragt die oben erstellte Ansicht ab, konvertiert den RAW-Datentyp zurück in VARCHAR2 und konvertiert es in normales Hangul, indem es den Quellzeichensatz und den Zielzeichensatz mit der Funktion CONVERT angibt.
Erstellen Sie mit dem folgenden Skript eine Ansicht, die den Datentyp VARCHAR2 in den Datentyp RAW in der ORAUS7-Instanz konvertiert.
-- ORAUS7에 View 생성 create or replace view vw_sub_mon_stat as select use_mon --,line_num ,utl_raw.cast_to_raw(line_num) as line_num_raw ,sub_sta_id --,sub_sta_nm ,utl_raw.cast_to_raw(sub_sta_nm) as sub_sta_nm_raw ,ride_pasgr_num, alight_pasgr_num, work_dt, commt from sub_mon_stat ;
-- ORAMSWIN949: utl_raw.cast_to_varchar2, convert 함수 적용하여 한글 데이터 정상 표시 select use_mon ,convert(utl_raw.cast_to_varchar2(line_num_raw), 'KO16MSWIN949', 'KO16MSWIN949') line_num ,sub_sta_id ,convert(utl_raw.cast_to_varchar2(sub_sta_nm_raw), 'KO16MSWIN949', 'KO16MSWIN949') sub_sta_nm ,ride_pasgr_num, alight_pasgr_num, work_dt, commt from vw_sub_mon_stat@dl_us7 a ;
Das Ausführungsergebnis wird normalerweise wie folgt auf Koreanisch angezeigt.
Test #2) Holen Sie sich ORAMSWIN949-Daten von ORAUTF
Der Zeichensatz wird normalerweise auf DB Link von MSWIN949 in UTF8 konvertiert, und Koreanisch wird gut importiert.
-- ORAUTF에서 ORAMSWIN949 데이터 가져오기 select use_mon, line_num, sub_sta_id, sub_sta_nm, ride_pasgr_num, alight_pasgr_num, work_dt, commt from sub_mon_stat@dl_mswin949 ;
Das Ausführungsergebnis ist wie folgt.
Test #3) Holen Sie sich ORAUS7-Daten von ORAUTF
Wie in „Test #1) Importieren von ORAUS7-Daten aus ORAMSWIN949“ werden koreanische Zeichen als ? (Fragezeichen) angezeigt.
select use_mon, line_num, sub_sta_id, sub_sta_nm, ride_pasgr_num, alight_pasgr_num, work_dt, commt from sub_mon_stat@dl_us7 ;
Das Ausführungsergebnis ist wie folgt.
Um Koreanisch normal anzuzeigen, wird die im Schritt „Test #1) Importieren von ORAUS7-Daten aus ORAMSWIN949“ erstellte Ansicht so verwendet, wie sie ist, und nur der CONVERT-Funktionsparameter der in ORAUTF über DB Link ausgeführten SQL muss geringfügig geändert werden.
-- ORAUTF: utl_raw.cast_to_varchar2, convert 함수 적용하여 한글 데이터 정상 표시 select use_mon ,convert(utl_raw.cast_to_varchar2(line_num_raw), 'AL32UTF8', 'KO16MSWIN949') line_num ,sub_sta_id ,convert(utl_raw.cast_to_varchar2(sub_sta_nm_raw), 'AL32UTF8', 'KO16MSWIN949') sub_sta_nm ,ride_pasgr_num, alight_pasgr_num, work_dt, commt from vw_sub_mon_stat@dl_us7 a ;
AL32UTF8 wird angegeben, da der zweite Parameter der CONVERT-Funktion den Zielzeichensatz angibt.
Das Ausführungsergebnis ist wie folgt.
Bezug
Entdecken Sie RAW-Datentypen
Nachfolgend finden Sie einige Auszüge aus der Oracle-Dokumentation zu RAW-Datentypen.
Quelle: https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#SQLRF50993
RAW- und LONG RAW-Datentypen
Die Datentypen RAW und LONG RAW speichern Daten, die nicht explizit von Oracle Database konvertiert werden sollen, wenn Daten zwischen verschiedenen Systemen verschoben werden. Diese Datentypen sind für binäre Daten oder Bytefolgen vorgesehen. Beispielsweise können Sie LONG RAW verwenden, um Grafiken, Sound, Dokumente oder Arrays von Binärdaten zu speichern, deren Interpretation von der Verwendung abhängt.
…
RAW ist ein Datentyp mit variabler Länge wie VARCHAR2, mit Ausnahme von Oracle Net (das Client-Software mit einer Datenbank oder einer Datenbank mit einer anderen verbindet) und den Import- und Exportdienstprogrammen von Oracle Führen Sie keine Zeichenkonvertierung durch, wenn Sie RAW- oder LONG RAW-Daten übertragen Im Gegensatz dazu konvertieren Oracle Net und die Import- und Export-Dienstprogramme von Oracle automatisch CHAR-, VARCHAR2- und LONG-Daten zwischen verschiedenen Datenbankzeichensätzen, wenn Daten zwischen Datenbanken transportiert werden, oder zwischen dem Datenbankzeichensatz und dem Client-Zeichensatz, wenn Daten transportiert werden zwischen einer Datenbank und einem Client. Der Client-Zeichensatz wird durch den Typ der Client-Schnittstelle, z. B. OCI oder JDBC, und die Client-Konfiguration (z. B. die Umgebungsvariable NLS_LANG) bestimmt.
Die Bedeutung des Satzes mit umgekehrter Farbe unter den obigen Inhalten ist wie folgt.
- Diese Datentypen sind für binäre Daten oder Bytefolgen vorgesehen
–> RAW-Datentyp wird zum Speichern von Binärdaten verwendet. - Führen Sie keine Zeichenkonvertierung durch, wenn Sie RAW- oder LONG RAW-Daten übertragen
–> Beim Übertragen des RAW-Datentyps über DB Link (Oracle Net) wird der Zeichensatz nicht konvertiert.
Zeichensatzkonvertierungsfunktion CONVERT
Nachfolgend finden Sie einige Auszüge aus der Oracle-Dokumentation zur CONVERT-Funktion.
Quelle: https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions034.htm#SQLRF00620
CONVERT wandelt eine Zeichenkette von einem Zeichensatz in einen anderen um.
– Das Argument char ist der umzuwandelnde Wert. Es kann jeder der Datentypen CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB oder NCLOB sein.
– Das Argument dest_char_set ist der Name des Zeichensatzes, in den char konvertiert wird.
– Das Argument source_char_set ist der Name des Zeichensatzes, in dem char in der Datenbank gespeichert ist. Der Standardwert ist der Datenbankzeichensatz.
Der Rückgabewert für CHAR und VARCHAR2 ist VARCHAR2. Für NCHAR und NVARCHAR2 ist es NVARCHAR2. Für CLOB ist es CLOB und für NCLOB ist es NCLOB.
Vorsichtsmaßnahmen
RAW-Datentyp kann bis zu 2000 Byte verwendet werden. Es kann nach Oracle 12c R2 erweitert werden, jedoch im Allgemeinen bis zu 2000 Bytes. In US7ASCII wird Hangul in 2 Bytes gespeichert, daher kann diese Methode nur bis zu 1000 Hangul-Zeichen angewendet werden.
(Wenn englische Buchstaben und Zahlen enthalten sind, kann sich die Anzahl der konvertierbaren Zeichen erhöhen.)
Um Daten von mehr als 2000 Byte zu konvertieren, scheint es möglich, die Ansicht in zwei oder mehr Spalten zu unterteilen und sie nach der Konvertierung in der Instanz (z. B. ORAUTF), die die Ansicht liest, zusammenzufassen, dies wurde jedoch nicht getestet.
Beachten Sie die maximale Anzahl an Bytes, die konvertiert werden können.