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.

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.

DB 서버, DB Link 구성, 테스트 케이스
DB-Server, DB-Link-Konfiguration, Testfall
  1. Holen Sie sich ORAUS7-Daten von ORAMSWIN949
  2. Holen Sie sich ORAMSWIN949-Daten von ORAUTF
  3. Holen Sie sich ORAUS7-Daten von ORAUTF

In ORAUS7 gespeicherte Hangul-Daten können wie folgt überprüft werden.

ORAUS7에 저장된 한글 데이터 확인
Überprüfen Sie die in ORAUS7 gespeicherten Hangul-Daten
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).

테스트 #1) ORAMSWIN949 에서 ORAUS7 데이터 가져오기 실행 결과
Test #1-1) Ergebnis des Imports von ORAUS7-Daten aus ORAMSWIN949

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 #1-2) Ergebnis des Imports von ORAUS7-Daten über Ansicht in ORAMSWIN949

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.

테스트 #2) ORAUTF 에서 ORAMSWIN949 데이터 가져오기 실행 결과
Testergebnis #2) Holen Sie sich ORAMSWIN949-Daten von ORAUTF

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.

Test #3-1) Ergebnis des Imports von ORAUS7-Daten aus ORAUTF

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.

테스트 #3-2) ORAUTF 에서 View를 통해 ORAUS7 데이터 가져오기 실행 결과
Test #3-2) Ergebnis des Imports von ORAUS7-Daten durch View in ORAUTF

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

Character set 변환 함수 CONVERT Syntax
Zeichensatzkonvertierungsfunktion CONVERT Syntax

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

de_DEDeutsch