Conversión de juegos de caracteres de Oracle (9): 6. Cómo convertir juegos de caracteres implementados por el usuario (2)

Publicación anterior (Conversión de conjuntos de caracteres de Oracle(8): 6. Cómo convertir un conjunto de caracteres implementado por el usuario (1)), se examina el método de conversión de juego de caracteres implementado por el usuario. Puede verificar cómo convertir de KO16MSWIN949, US7ASCII a AL32UTF8 usando los paquetes DB Link, CTAS y UTL_RAW.

Este es un método para convertir juegos de caracteres mientras se importan datos a través de DB Link.

Configure tres instancias de base de datos en un servidor y ejecute tres pruebas.

DB 서버, DB Link 구성, 테스트 케이스
Servidor de base de datos, configuración de enlace de base de datos, caso de prueba
  1. Obtenga datos de ORAUS7 de ORAMSWIN949
  2. Obtenga datos de ORAMSWIN949 de ORAUTF
  3. Obtenga datos de ORAUS7 de ORAUTF

Los datos Hangul almacenados en ORAUS7 se pueden verificar de la siguiente manera.

ORAUS7에 저장된 한글 데이터 확인
Verifique los datos Hangul almacenados en ORAUS7
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>

Las siguientes pruebas utilizan Oracle SQL Developer.

SQL Developer es una herramienta proporcionada por Oracle y es gratuita. Puede descargarlo desde la siguiente URL.

Descargas para desarrolladores de Oracle SQL

Prueba #1) Obtenga datos ORAUS7 de ORAMSWIN949

Puede importar datos creando un enlace de base de datos DL_US7 y especificando el enlace de base de datos "dl_us7". El guión es el siguiente.

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
;

Los caracteres coreanos en el resultado de la ejecución no se muestran normalmente, sino que aparecen como caracteres ? (signo de interrogación).

테스트 #1) ORAMSWIN949 에서 ORAUS7 데이터 가져오기 실행 결과
Prueba #1-1) Resultado de la importación de datos ORAUS7 desde ORAMSWIN949

Cuando los datos se importan a través de DB Link, el juego de caracteres del servidor (ORAUS7 en este caso) se convierte al juego de caracteres del cliente (ORAMSWIN949 en este caso).

Hangul almacenado en US7ASCII se almacena incorrectamente, por lo que no se puede convertir a MSWIN949, por lo que se muestra como un signo de interrogación.

Para mostrar los datos coreanos de ORAUS7 normalmente en esta situación, aplique el siguiente método.

  • Cree una vista en ORAUS7 utilizando la función UTL_RAW.CAST_TO_RAW para evitar que las columnas de tipo de datos VARCHAR2 que contienen caracteres coreanos se conviertan en conjuntos de caracteres.
    • Aplique la función UTL_RAW.CAST_TO_RAW a las columnas que contengan caracteres coreanos.
    • El tipo de datos RAW no convierte el juego de caracteres.
  • ORAMSWIN949 consulta la Vista creada anteriormente, convierte el tipo de datos RAW de nuevo a VARCHAR2 y lo convierte a Hangul normal especificando el conjunto de caracteres de origen y el conjunto de caracteres de destino con la función CONVERTIR.

Cree una vista que convierta el tipo de datos VARCHAR2 al tipo de datos RAW en la instancia de ORAUS7 con el siguiente script.

-- 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
;

El resultado de la ejecución normalmente se muestra en coreano de la siguiente manera.

Prueba #1-2) Resultado de la importación de datos ORAUS7 a través de Ver en ORAMSWIN949

Prueba #2) Obtenga datos ORAMSWIN949 de ORAUTF

El juego de caracteres normalmente se convierte de MSWIN949 a UTF8 en DB Link, y el coreano se importa bien.

-- 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
;

El resultado de la ejecución es el siguiente.

테스트 #2) ORAUTF 에서 ORAMSWIN949 데이터 가져오기 실행 결과
Resultado de la prueba #2) Obtener datos ORAMSWIN949 de ORAUTF

Prueba #3) Obtener datos ORAUS7 de ORAUTF

Al igual que en “Prueba #1) Importación de datos de ORAUS7 desde ORAMSWIN949”, los caracteres coreanos se muestran como ? (signo de interrogación).

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
;

El resultado de la ejecución es el siguiente.

Prueba #3-1) Resultado de la importación de datos ORAUS7 desde ORAUTF

Para mostrar el coreano normalmente, la vista creada en el paso "Prueba #1) Importación de datos de ORAUS7 desde ORAMSWIN949" se usa tal cual, y solo se debe cambiar ligeramente el parámetro de la función CONVERTIR del SQL ejecutado en ORAUTF a través de DB Link.

-- 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
;

Se especifica AL32UTF8 porque el segundo parámetro de la función CONVERTIR significa el conjunto de caracteres de destino.

El resultado de la ejecución es el siguiente.

테스트 #3-2) ORAUTF 에서 View를 통해 ORAUS7 데이터 가져오기 실행 결과
Prueba #3-2) Resultado de importar datos de ORAUS7 a través de Ver en ORAUTF

Referencia

Explore los tipos de datos RAW

A continuación se proporcionan algunos extractos de la documentación de Oracle sobre los tipos de datos RAW.

fuente: https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#SQLRF50993

Tipos de datos RAW y LONG RAW

Los tipos de datos RAW y LONG RAW almacenan datos que Oracle Database no debe convertir explícitamente al mover datos entre diferentes sistemas. Estos tipos de datos están destinados a datos binarios o cadenas de bytes. Por ejemplo, puede usar LONG RAW para almacenar gráficos, sonido, documentos o matrices de datos binarios, cuya interpretación depende del uso.

RAW es un tipo de datos de longitud variable como VARCHAR2, excepto que Oracle Net (que conecta el software del cliente a una base de datos o una base de datos a otra) y las utilidades de importación y exportación de Oracle no realice la conversión de caracteres al transmitir datos RAW o LONG RAW Por el contrario, Oracle Net y las utilidades de importación y exportación de Oracle convierten automáticamente los datos CHAR, VARCHAR2 y LONG entre diferentes juegos de caracteres de base de datos, si los datos se transportan entre bases de datos, o entre el juego de caracteres de la base de datos y el juego de caracteres del cliente, si se transportan datos. entre una base de datos y un cliente. El juego de caracteres del cliente está determinado por el tipo de interfaz del cliente, como OCI o JDBC, y la configuración del cliente (por ejemplo, la variable de entorno NLS_LANG).

El significado de la oración con color invertido entre los contenidos anteriores es el siguiente.

  • Estos tipos de datos están destinados a datos binarios o cadenas de bytes.
    –> El tipo de datos RAW se utiliza para almacenar datos binarios.
  • no realice la conversión de caracteres al transmitir datos RAW o LONG RAW
    –> Cuando se transmite el tipo de datos RAW a través de DB Link (Oracle Net), el conjunto de caracteres no se convierte.

Función de conversión de juego de caracteres CONVERTIR

A continuación se proporcionan algunos extractos de la documentación de Oracle sobre la función CONVERTIR.

fuente: https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions034.htm#SQLRF00620

Character set 변환 함수 CONVERT Syntax
Función de conversión de juego de caracteres CONVERT Sintaxis

CONVERT convierte una cadena de caracteres de un juego de caracteres a otro.

  – El argumento char es el valor a convertir. Puede ser cualquiera de los tipos de datos CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB o NCLOB.

  – El argumento dest_char_set es el nombre del conjunto de caracteres al que se convierte char.

  – El argumento source_char_set es el nombre del conjunto de caracteres en el que se almacena char en la base de datos. El valor predeterminado es el juego de caracteres de la base de datos.

El valor de retorno para CHAR y VARCHAR2 es VARCHAR2. Para NCHAR y NVARCHAR2, es NVARCHAR2. Para CLOB, es CLOB y para NCLOB, es NCLOB.

Precauciones

El tipo de datos RAW se puede utilizar hasta 2000 bytes. Puede extenderse después de Oracle 12c R2, pero generalmente hasta 2000 bytes. En US7ASCII, Hangul se almacena en 2 bytes, por lo que este método solo se puede aplicar hasta 1000 caracteres Hangul.

(Si se incluyen letras y números en inglés, la cantidad de caracteres convertibles puede aumentar).

Para convertir datos que excedan los 2000 bytes, parece posible dividir la vista en dos o más columnas y combinarlas después de convertirlas en la instancia (por ejemplo, ORAUTF) que lee la vista, pero esto no se ha probado.

Preste atención al número máximo de bytes que se pueden convertir.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESEspañol