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.
6.2.3. Método 3) Enlace DB y 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.
- Obtenga datos de ORAUS7 de ORAMSWIN949
- Obtenga datos de ORAMSWIN949 de ORAUTF
- Obtenga datos de ORAUS7 de ORAUTF
Los datos Hangul almacenados en ORAUS7 se pueden verificar de la siguiente manera.
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).
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 #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.
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.
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.
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
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.